Introduction
In our Project we want to present and compare production and emission
values of different companies which are either state owned, investor
owned or so called “nation state” owned over the time frame of 1854
until 2022. The companies in question all produce different resources,
some of which are oil, gas, cement and a variety of different forms of
coal. In short: They produce fossil fuel and related materials.
Especially in a modern world where the CO2 footprint is of importance
and reduction of CO2 production is essential to comply with the goals
set by leading scientists, taking a look at historical data can unravel
some trends that continue to this date.
Used Data
The data used for this project stems from the GitHub Tidytuesday
repository and was collected and compiled by Carbon Majors. In this
analysis, we used the medium granularity dataset, which includes year,
entity, entity type, commodity, commodity production, commodity unit,
and total emissions but excludes the reporting entity, data point
source, product emissions, and the four different operational emissions:
flaring, venting, own fuel use, and fugitive methane.
Analysed
Companies
The first table revolves around different companies which are
producing different commodities and CO2 - emissions, their ownership and
the type of commodity. It provides a short overview of all the analyzed
companies, but excludes numerical data points as those would be to
unwieldly. In total, 122 companies were analyzed in this dataset,
differentiating between seven different commodities.
library(data.table)
library(DT)
datatable(Company)
Resource production
Data
The first chapter revolves around the production of each resource per
year. Important to note is, that not all resources were produced from
1854 onwards, but some were only discovered in later years. Also, when
looking at the data it should be noted that different commodities were
be produced in different units but still plotted in the same chart. The
reason for this is simply to highlight the difference in production
capacity of each resource type per year. The different used metrics
were:
Coal and cement production were measured in million
tonnes/year.
Natural Gas production was measured in bcm/year.
Oil production was measured in bbl/year
Production per
resource type
The first graph illustrates the annual production values of various
commodities over time, highlighting key items such as different coal
types (Anthracite, Bituminous, Sub-Bituminous, Lignite, and Thermal
Coal), Natural Gas, Oil & NGL (Natural Gas Liquids), and Cement. The
production value of Oil & NGL, represented by the yellow line,
exhibits a pronounced increase beginning in the mid-20th century,
establishing it as the leading contributor to global energy and
industrial production.
library(tidyverse)
library(ggplot2)
library(dplyr)
library(plotly)
economist_colors <- c(
"Thermal Coal" = "#E3120B", # Red
"Anthracite Coal" = "#6A1B9A",
"Lignite Coal" = "#FFEB3B",
"Bituminous Coal" = "#FF5722",
"Metallurgical Coal" = "#F4A6A0",
"Sub-Bituminous Coal" = "#8B4513",
"Oil & NGL" = "#0056A3", # Blue
"Natural Gas" = "#008F47", # Green
"Cement" = "#A5A5A5" # Grey
)
prod_year_source$commodity <- factor(prod_year_source$commodity, levels = names(economist_colors))
# Plot using plotly
plot_ly(prod_year_source, x = ~year, y = ~sum_prod_val, color = ~commodity,
colors = economist_colors, type = 'scatter', mode = 'lines') %>%
layout(
title = "Production value per year per resource type",
xaxis = list(title = "Year"),
yaxis = list(title = "Production Value"),
legend = list(title = list(text = "resource type"))
)
During this timeframe, listed commodities, particularly oil, natural
gas, and coal, experienced substantial growth in production value,
paralleling the economic expansion, industrialisation, and urbanisation
that followed World War II. The preeminence of oil from the mid-20th
century onward underscores its critical importance in energy generation,
transportation, and industrial applications. Notably, Bituminous Coal
(brown line) and Thermal Coal (gray line) demonstrated significant
growth throughout the industrialisation era (1900–1950), reaching peaks
in the mid to late 20th century, which corresponds with the extensive
utilisation of coal for electricity generation and heavy industry.
Production values
from 1940 to 2022
This revised graph emphasises the production values of various
commodities from 1940 onward. The production value of Oil & NGL
(yellow line) shows a remarkable surge post-1940, surpassing all other
commodities by the late 20th century, indicative of the increasing
global reliance on oil for transportation, industrial activities, and
energy generation. This trend of high production value persists into the
21st century. Following 1940, the global energy landscape underwent a
gradual transition from coal to oil and gas, propelled by technological
innovations, economic development, and a rising demand for liquid fuels
and cleaner energy alternatives.
library(ggplot2)
library(plotly)
library(dplyr)
economist_colors <- c(
"Thermal Coal" = "#E3120B", # Red
"Anthracite Coal" = "#6A1B9A",
"Lignite Coal" = "#FFEB3B",
"Bituminous Coal" = "#FF5722",
"Metallurgical Coal" = "#F4A6A0",
"Sub-Bituminous Coal" = "#8B4513",
"Oil & NGL" = "#0056A3", # Blue
"Natural Gas" = "#008F47", # Green
"Cement" = "#A5A5A5" # Grey
)
prod_year_1940$commodity <- factor(prod_year_1940$commodity, levels = names(economist_colors))
#Plot 1940 onwards for showcasing increase after Industrialisation
plot_ly(prod_year_1940, x = ~year, y = ~sum_prod_val, color = ~commodity, colors = economist_colors, type = 'scatter', mode = 'lines') %>%
layout(
title = "Production per year per resource type from 1940",
xaxis = list(title = "Year"),
yaxis = list(title = "production value"),
legend = list(title = list(text = "resource type"))
)
Production Values
without Oil, NGL and Gas
This graph illustrates the annual production value of various
commodities, excluding Oil, NGL, and Gas, thereby offering a more
focused perspective on resources such as coal in its various forms,
cement, and metallurgical products.
library(ggplot2)
library(plotly)
library(dplyr)
economist_colors <- c(
"Thermal Coal" = "#E3120B", # Red
"Anthracite Coal" = "#6A1B9A",
"Lignite Coal" = "#FFEB3B",
"Bituminous Coal" = "#FF5722",
"Metallurgical Coal" = "#F4A6A0",
"Sub-Bituminous Coal" = "#8B4513",
"Oil & NGL" = "#0056A3", # Blue
"Natural Gas" = "#008F47", # Green
"Cement" = "#A5A5A5" # Grey
)
prod_year_1940$commodity <- factor(prod_year_1940$commodity, levels = names(economist_colors))
#Plot all commodities excluding Gas and Oil due tu overwhelming superiority
plot_ly(prod_year_exc, x = ~year, y = ~sum_prod_val, color = ~commodity, colors = economist_colors, type = 'scatter', mode = 'lines') %>%
layout(
title = "Production value per year per resource type excluding Oil, NGL and Gas",
xaxis = list(title = "Year"),
yaxis = list(title = "production value"),
legend = list(title = list(text = "resource type"))
)
A comprehensive analysis of the observed trends shows:
Among the excluded commodities, Bituminous coal stands out as
the leading product, experiencing a significant increase in production
beginning in the 1960s, reaching its peak around 2010, followed by a
slight decline. This trend underscores its ongoing relevance in energy
generation and industrial applications, particularly in developing
nations that depend on coal-fired power facilities.
The production value of cement has seen substantial growth since
the 1980s, with a notable acceleration in the 2000s. This surge is a
mark of a global infrastructure and construction boom, as well as rapid
urbanisation and industrialisation in developing contries.
Thermal coal displays a gradual increase simular to that of
Bituminous coal, although it maintains a lower overall production value,
reflecting its specific applications within certain energy
sectors.
The production of metallurgical coal has shown consistent growth,
closely linked to advancements in infrastructure and industrial
development.
In contrast, Lignite coal has experienced limited growth relative
to other coal types, which can be attributed to its specialised
applications.
Both Anthracite Coal and Sub-Bituminous Coal reveal relatively
stable trends, suggesting lower production values and minimal growth
when compared to other commodities.
These observations indicate that, despite a global movement towards
cleaner energy sources, coal, particularly Bituminous and Thermal Coal,
continues to play a crucial role in numerous economies. Additionally,
the growth in cement production reflects an ongoing demand for
construction materials, driven by urbanisation, industrialisation and
infrastructure initiatives. However, the relatively stable trends for
certain coal types and metallurgical products imply a potential shift in
resource priorities over time, with a focus on materials that are in
higher demand and offer greater versatility.
Production values
including total production
Total Production Value: Since the mid-20th century, there has been a
significant increase in total production value, that serves as an
indication of the overall growth of various resources. This increase is
primarily attributed to Oil & NGL and Natural Gas, which are the
predominant contributors to the total. It is essential to note, that the
combined units varied, meaning that the figure does not reflect an exact
value but rather illustrates the general trend over the years.
library(ggplot2)
library(plotly)
library(dplyr)
economist_colors <- c(
"Thermal Coal" = "#E3120B", # Red
"Anthracite Coal" = "#6A1B9A",
"Lignite Coal" = "#FFEB3B",
"Bituminous Coal" = "#FF5722",
"Metallurgical Coal" = "#F4A6A0",
"Sub-Bituminous Coal" = "#8B4513",
"Oil & NGL" = "#0056A3", # Blue
"Natural Gas" = "#008F47", # Green
"Cement" = "#F5F5DC", # Grey
"total" = "#A5A5A5"
)
prod_year_1940$commodity <- factor(prod_year_1940$commodity, levels = names(economist_colors))
#Plot all commodities including total production
plot_ly(total_prod_joined, x = ~year, y = ~sum_prod_val, color = ~commodity, colors = economist_colors, type = 'scatter', mode = 'lines') %>%
layout(
title = "Production value per year per resource type including total",
xaxis = list(title = "Year"),
yaxis = list(title = "production value"),
legend = list(title = list(text = "resource type"))
)
Comparison of
production between early 20th and 21st century
These charts illustrate the summarized produced commodities in 1900 -
1922 against 2000 - 2022. They showcase the progress in production that
has been achieved in the last century magnifying the enormous change
that has happened. Especially when taking a closer look at the
percentage change between the production in the 20th century compared to
the 21st century, a clear shift away from coal and towards Oil and NGL
can be observed.
library(dplyr)
library(plotly)
#1. Aggregate the data
sum_data_1922_1 <- sum_data_1922 %>%
group_by(commodity) %>%
summarise(total_production = sum(sum_prod_val, na.rm = TRUE)) %>%
arrange(desc(total_production))
# 2. Select the top 8 commodities
top_commodities <- sum_data_1922_1 %>%
slice_head(n = 8)
# Calculate percentages
top_commodities <- top_commodities %>%
mutate(percent = total_production / sum(total_production) * 100)
# 3. Create the interactive pie chart
pie_chart <- plot_ly(
data = top_commodities,
labels = ~commodity,
values = ~total_production,
type = 'pie',
textinfo = 'label+percent', # Display both label and percent on the pie
insidetextorientation = 'horizontal', # Make text inside horizontal
hoverinfo = 'label+percent+value', # Tooltip shows label, percent, and value
marker = list(colors = colorRampPalette(c(
"#0056A3", # Natural Gas
"#FF5722", # Oil & NGL
"#008F47", # Bituminous coal
"#FF0000", # Cement
"lightblue", # Metallurgical Coal
"#FFEB3B", # Sub - Bituminous coal
"grey", # Lignite Coal
"purple", # Thermal Coal
"pink" # Anthracite Coal
))(8)) # Custom colors
) %>%
layout(
title = "Top 8 Commodities by Total Production",
showlegend = TRUE,
legend = list(title = list(text = "resource type")),
margin = list(l = 50, r = 50, t = 50, b = 50) # Add padding for labels
)
# Display the pie chart
pie_chart
library(dplyr)
library(plotly)
#1. Aggregate the data
sum_data_2022_1 <- sum_data_2022 %>%
group_by(commodity) %>%
summarise(total_production = sum(sum_prod_val, na.rm = TRUE)) %>%
arrange(desc(total_production))
# 2. Select the top 8 commodities
top_commodities <- sum_data_2022_1 %>%
slice_head(n = 9)
# Calculate percentages
top_commodities <- top_commodities %>%
mutate(percent = total_production / sum(total_production) * 100)
# 3. Create the interactive pie chart
pie_chart2 <- plot_ly(
data = top_commodities,
labels = ~commodity,
values = ~total_production,
type = 'pie',
textinfo = 'label+percent', # Display both label and percent on the pie
insidetextorientation = 'horizontal', # Make text inside horizontal
hoverinfo = 'label+percent+value', # Tooltip shows label, percent, and value
marker = list(colors = colorRampPalette(c(
"#008F47", # Natural Gas
"#0056A3", # Oil & NGL
"#FF5722", # Bituminous coal
"#81C784", # Cement
"#FFEB3B", # Metallurgical Coal
"lightblue", # Sub - Bituminous coal
"grey", # Lignite Coal
"#FF0000", # Thermal Coal
"pink", # Anthracite Coal
"purple"
))(9)) # Custom colors
) %>%
layout(
title = "Top 9 Commodities by Total Production",
showlegend = TRUE,
legend = list(title = list(text = "resource type")),
margin = list(l = 50, r = 50, t = 50, b = 50) # Add padding for labels
)
# Display the pie chart
pie_chart2
However, the showcased percentage points and thus the indicated lower
production of all commodities revolving arround coal are misleading due
to the exponential increase in total production that occurred over the
last century. As a matter of fact, the coal production did increase from
the 20th towards the 21st century. However it just did not increase in
exponential fashion but more linear. Thus, a more detailed analysis
shows:
The percentage of Oil and NGL production is lower in 21st century
compared to the 20th century. This by no means says, that the total
production is reduced, but it showcases just how much natural Gas is
produced to this day.
Oil, NGL & Gas make up 87.2 % of all produced commodities in
21st century showcasing their relevance today, while back in the 20th
century, production was more diverse with four major players. All of
those major players participating over 10% with two of which even
participating over 20% to the total production. When comparing the
charts it becomes clear that, Oil and NGL were dominating already and
continued their dominance, whilst bituminous coal has lost almost 20 %.
Natural gas has clearly risen from 12.5% to most produced commodity with
a total of 45 %.
The majority of coal classes never showed a huge percentage of
total production and did also not catch up, whilst some even lost
relevance over the course of the century.
Cement was not produced until the mid 20th century, however it
also did not exceeded a participation to the total production of 3.4%
during the time it was produced making it only a minor player. However
it is important to note that it still is one of three resource types
that increased in percentage total production.
Concluding it can be said that the production did change in the last
century, mainly all analyzed commodities increased their total
production volume, however the percentage showcased one major winner and
one major looser during the last decade. All other commodities did gain
or lose a few percentage points, but no striking change was noted.
Comparison of total
emission versus total production
Comming to an end of the analysis of total production we wanted to
compare the total production summarized versus the total emission. First
of all, it has to be denoted that the summarized production consists of
a summary of different units and is thus only an estimation, while the
summarized emissions consist of one single unit and are thus
precice.
library(plotly)
library(dplyr)
plot_ly(total_emiss_prod, x = ~year, y = ~value , color = ~category, colors = "Set1", type = 'scatter', mode = 'lines') %>%
layout(
title = "Production value per year per resource type including total",
xaxis = list(title = "Year"),
yaxis = list(title = "Emission value"),
legend = list(title = list(text = "resource type"))
)
When analyzing the data an almost exponential increase of production
values can be seen while the emission values lag behind. However, they
still show a similar pattern indicating a correlation between high
production and high emission. When comparing the two curves one clear
distinction can be observed.
While the production values show very sharp drops and rapid
reconsolidation, the emission values seem to be a bit less dynamic. They
do not spike as highly but do not drop as sharply indicating a
decoupling between production and emission. The argument becomes more
compelling when evaluating the last 10 years. While production continues
to rise, emissions stagnate, though a trend reversal can not be observed
as of yet.
Analysis of Emission
Data
Total emissions by
ownership and resource type
This bar chart presents the total emissions (measured in MtCO2e)
categorized by three types of ownership: Investor-owned Companies,
Nation States, and State-owned Entities. The emissions data is further
categorized by resource type, which includes Coal (indicated in red),
Gas (indicated in green), Oil (indicated in blue), and Other (indicated
in gray). The primary findings are as follows:
The emissions from investor-owned companies are predominantly
derived from Oil and Gas, with a lesser contribution from coal.
For nation-owned companies, coal is the principal source of
emissions, with Oil and Gas contributing to a lesser extent.
State-owned companies primarily generate emissions from Oil, with
total emissions being considerably higher than those from privately
owned companies, yet still lower than those from nation-owned
entities.
A potential explanation for these trends is that investor-owned
companies tend to operate on a smaller scale with a focus on
profitability. In contrast, nation-owned companies may prioritize energy
security and emphasize energy production from domestic resources. A
similar rationale may apply to state-owned companies, which often
oversee the national oil and gas sectors and serve as a crucial revenue
source for many governments.
library(tidyverse)
library(ggplot2)
library(dplyr)
library(plotly)
#open the data
data <- emissions
#filtering the last 50 years
latest50_years = max(data$year)
data <-data %>%
filter( year >= (latest50_years- 50))
# categorized commodities
data$resource_type <- ifelse(
data$commodity == "Oil & NGL", "Oil",
ifelse(
data$commodity == "Natural Gas", "Gas",
ifelse(
data$commodity %in% c("Metallurgical Coal", "Anthracite Coal" ,
"Bituminous Coal","Sub-Bituminous Coal",
"Thermal Coal" ,"Lignite Coal" ), "Coal",
"Other"
)
)
)
#summery for ownership and commodity into emmisions
summary_data <- data %>%
group_by(parent_type,resource_type) %>%
summarise(emissions_MtCO2e = sum(total_emissions_MtCO2e, na.rm = TRUE))%>%
ungroup()
# Colors
economist_colors <- c(
"Coal" = "#E3120B", # Bold red
"Oil" = "#0056A3", # Bold blue
"Gas" = "#008F47", # Bold green
"Other" = "#A5A5A5" # Neutral gray
)
# BAR CHART
static_plot <- ggplot(summary_data, aes(
x = parent_type,
y = emissions_MtCO2e,
fill = resource_type,
text = paste0(
"Ownership: ", parent_type,
"<br>Resource: ", resource_type,
"<br>Emission: ", round(emissions_MtCO2e, 2), " MtCO2e"
)
)) +
geom_bar(stat = "identity", position = "stack", width = 0.7) + # Adjust bar width
labs(
title = "Total Emissions by Ownership and Resource Type",
subtitle = "Stacked emissions across different ownership categories",
x = "Ownership",
y = "Total Emissions in MtCO2",
fill = "Resource Type"
) +
scale_fill_manual(values = economist_colors) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", size = 16, color = "black"),
plot.subtitle = element_text(size = 12, color = "black"),
axis.title.x = element_text(size = 12, color = "black"),
axis.title.y = element_text(size = 12, color = "black"),
axis.text = element_text(size = 10, color = "black"),
legend.position = "top",
legend.title = element_text(size = 12),
legend.text = element_text(size = 10),
panel.background = element_rect(fill = "white", color = NA),
plot.background = element_rect(fill = "white", color = NA),
panel.grid.major.y = element_line(color = "grey80", linetype = "dotted"),
panel.grid.major.x = element_blank(),
panel.border = element_blank()
)
# Convert to interactive plot
interactive_plot <- ggplotly(static_plot, tooltip = "text")
interactive_plot
Yearly emissions by
resource type type
A new chart presents an analysis of annual emissions categorized by
commodity type from 1900 to 2025, specifically focusing on Coal, Gas,
Oil, and Other resources. This graph effectively integrates data from
State-owned Entities and Nation States. The principal findings are as
follows:
Coal continues to be the predominant source of emissions,
followed by Oil, with Gas contributing less significantly and Other
resources having minimal impact.
A notable surge in emissions across all resource categories is
observed beginning in the mid-20th century.
While coal emissions are substantial, there is a marked increase
in oil emissions post-mid-20th century, and gas emissions exhibit a more
gradual rise.
Several factors may explain these trends. Coal served as the
foundation of the industrial revolution and maintained its status as the
primary energy source for many years due to its availability and
affordability. It became the leading fuel for power generation
worldwide, with its usage peaking in the late 20th century to match with
rising electricity demands.
The peak period for oil emissions occurred from the late 20th century
to the early 21st century, coinciding with the global expansion of
transportation modes such as automobiles, aircraft, and shipping
following World War II. Additionally, oil emerged as a crucial component
in the production of plastics, chemicals, and synthetic materials,
further escalating demand. The 1970s experienced significant increases
in oil production and emissions, despite fluctuations in prices, largely
due to the control exerted by state-owned entities in OPEC nations over
a substantial portion of the global supply.
Natural gas has gained traction as a “cleaner” fossil fuel
alternative to coal, resulting in a steady rise in emissions as nations
shifted away from coal dependency. Numerous Nation States and
State-owned Entities have made considerable investments in gas
production, recognising it as a strategic energy resource, particularly
in the 21st century. This upward trend in gas emissions is ongoing,
reflecting consistent growth since the late 20th century.
library(tidyverse)
library(ggplot2)
library(dplyr)
library(plotly)
#open the data
#file_path <- "~/Desktop/Rproject/Emissions_m.csv"
data_area <- emissions
# categorized commodities
data_area$resource_type <- ifelse(
data_area$commodity == "Oil & NGL", "Oil",
ifelse(
data_area$commodity == "Natural Gas", "Gas",
ifelse(
data_area$commodity %in% c("Metallurgical Coal", "Anthracite Coal",
"Bituminous Coal", "Sub-Bituminous Coal",
"Thermal Coal", "Lignite Coal"), "Coal",
"Other"
)
)
)
#convert and reverse order for stacking
data_area$resource_type <- factor(data_area$resource_type,
levels = c("Other", "Gas", "Oil", "Coal"))
# combine Nation and state-owned
filtered_data_area <- data_area %>%
filter(parent_type %in% c("Nation State", "State-owned Entity"))
# sum of Emis by year+type
summary_data_area <- filtered_data_area %>%
filter(!is.na(total_emissions_MtCO2e)) %>%
group_by(year, resource_type) %>%
summarise(emissions_MtCO2e = sum(total_emissions_MtCO2e, na.rm = TRUE)) %>%
ungroup()
# Need to stack it
summary_data_area <- summary_data_area %>%
arrange(year, resource_type) %>%
group_by(year) %>%
mutate(
ymin = cumsum(emissions_MtCO2e) - emissions_MtCO2e,#lowe
ymax = cumsum(emissions_MtCO2e) #upper
) %>%
ungroup()
# Economist-style colors
economist_colors <- c(
"Coal" = "#E3120B", # Red
"Oil" = "#0056A3", # Blue
"Gas" = "#008F47", # Green
"Other" = "#A5A5A5" # Grey
)
# PLOT
static_plot <- ggplot(summary_data_area, aes(x = year, group = resource_type)) +
# 1 layer faded stacked area chart
geom_ribbon(aes(
ymin = ymin,
ymax = ymax,
fill = resource_type,
text = paste0(
"Year: ", year,
"<br>Resource: ", resource_type,
"<br>Emission: ", round(emissions_MtCO2e, 2)
)
), alpha = 0.5) +
# 2nd layer adding Lines
geom_line(aes(
y = ymax,
color = resource_type,
text = paste0(
"Year: ", year,
"<br>Resource: ", resource_type,
"<br>Emission: ", round(emissions_MtCO2e, 2)
)
), size = 1, show.legend = FALSE) + # Suppress legend for lines
# 3rd layer adding label to a line
labs(
title = "Yearly Emissions for Nation and State owned",
x = "Year",
y = "Total Emissions in MtCO2",
fill = "Resource Type",
color = "Resource Type"
) +
# coloring
scale_fill_manual(values = economist_colors) +
scale_color_manual(values = economist_colors) +
scale_y_continuous(limits = c(0, NA), expand = expansion(mult = c(0, 0.05))) +
#general look
theme_minimal(base_size = 14) +
theme(
panel.background = element_rect(fill = "white", color = NA),
panel.grid.major.y = element_line(color = "grey80", linetype = "dotted"),
panel.grid.major.x = element_blank(),
legend.position = "top",
plot.background = element_rect(fill = "white", color = NA),
axis.text = element_text(color = "black"),
axis.title = element_text(color = "black")
)
# convert to an interactive plot
interactive_plot <- ggplotly(static_plot, tooltip = "text") %>%
layout(
legend = list(
title = list(text = "Resource Type"),
orientation = "v"
),
showlegend = TRUE
)
# Rename legend items to clean labels
interactive_plot$x$data <- lapply(interactive_plot$x$data, function(trace) {
if (!is.null(trace$legendgroup)) {
trace$name <- gsub(",1", "", trace$name) # Remove ",1"
trace$name <- gsub("\\(", "", trace$name) # Remove "("
trace$name <- gsub("\\)", "", trace$name) # Remove ")"
}
trace
})
interactive_plot
Yearly emissions by
resource type
The trends observed in investor-owned companies exhibit similarities
to those of state or nation-owned entities, yet notable distinctions
exist. Total emissions from investor-owned firms are comparatively lower
than those from their state/nation-owned counterparts. The emissions
profile of these companies is primarily influenced by oil and gas, with
coal contributing minimally. This suggests a pronounced emphasis on
market-driven resources, such as oil and gas, which tend to yield higher
profits within the private sector.
In investor-owned firms, oil emissions are particularly prominent,
peaking in conjunction with global industrial and transportation
expansions. The private sector’s tendency towards oil is a sign of its
profitability and robust demand in international markets. Although gas
also plays a significant role, it remains secondary to oil. Its
importance has grown in recent decades as private enterprises leverage
its rising demand as a “transition fuel.” Conversely, coal’s
contribution is considerably diminished, reflecting the private sector’s
gradual shift away from coal in response to regulatory challenges and
decreasing profitability.
In contrast, state or nation-owned entities exhibit significantly
higher total emissions, with coal being the predominant source, while
oil and gas also contribute substantially. These entities demonstrate a
slower pace in moving away from fossil fuels, particularly coal, which
may be attributed to political inertia, existing infrastructure, and
economic dependence on state-managed resources. While investor-owned
companies remain heavily reliant on oil and gas, they appear to be more
agile in adapting to market dynamics and regulatory influences,
potentially facilitating a more rapid transition towards cleaner energy
alternatives.
library(tidyverse)
library(ggplot2)
library(dplyr)
#open the data
#file_path <- "~/Desktop/Rproject/Emissions_m.csv"
data_area1 <- emissions
# Categorize the commodities
data_area1$resource_type1 <- ifelse(
data_area1$commodity == "Oil & NGL", "Oil",
ifelse(
data_area1$commodity == "Natural Gas", "Gas",
ifelse(
data_area1$commodity %in% c("Metallurgical Coal", "Anthracite Coal",
"Bituminous Coal", "Sub-Bituminous Coal",
"Thermal Coal", "Lignite Coal"), "Coal",
"Other"
)
)
)
# Convert resource_type1 to a factor with the desired stacking order
data_area1$resource_type1 <- factor(data_area1$resource_type1,
levels = c("Other", "Gas", "Coal", "Oil"))
# Filter for Investor-owned companies only
filtered_data_area1 <- data_area1 %>%
filter(parent_type == "Investor-owned Company")
# Summarize emissions by year and resource type
summary_data_area1 <- filtered_data_area1 %>%
filter(!is.na(total_emissions_MtCO2e)) %>%
group_by(year, resource_type1) %>%
summarise(emissions_MtCO2e1 = sum(total_emissions_MtCO2e, na.rm = TRUE)) %>%
ungroup()
# Calculate stacking (cumulative emissions)
summary_data_area1 <- summary_data_area1 %>%
arrange(year, resource_type1) %>%
group_by(year) %>%
mutate(
ymin = cumsum(emissions_MtCO2e1) - emissions_MtCO2e1, # Lower bound of the ribbon
ymax = cumsum(emissions_MtCO2e1) # Upper bound of the ribbon
) %>%
ungroup()
# Economist-style colors
economist_colors <- c(
"Oil" = "#0056A3", # Blue
"Coal" = "#E3120B", # Red
"Gas" = "#008F47", # Green
"Other" = "#A5A5A5" # Grey
)
# Plot
static_plot1 <- ggplot(summary_data_area1, aes(x = year, group = resource_type1)) +
# 1. Faded stacked area chart
geom_ribbon(aes(
ymin = ymin,
ymax = ymax,
fill = resource_type1,
text = paste0(
"Year: ", year,
"<br>Resource: ", resource_type1,
"<br>Emission: ", round(emissions_MtCO2e1, 2)
)
), alpha = 0.5) +
# 2. Line chart for the top of each ribbon
geom_line(aes(
y = ymax,
color = resource_type1,
text = paste0(
"Year: ", year,
"<br>Resource: ", resource_type1,
"<br>Emission: ", round(emissions_MtCO2e1, 2)
)
), size = 1, show.legend = FALSE) + # Suppress legend for lines
# 3. Labels
labs(
title = "Yearly Emissions for Investor-owned Companies",
x = "Year",
y = "Total Emissions in MtCO2",
fill = "Resource Type",
color = "Resource Type"
) +
# Colors for both areas and lines
scale_fill_manual(values = economist_colors) +
scale_color_manual(values = economist_colors) +
scale_y_continuous(limits = c(0, NA), expand = expansion(mult = c(0, 0.05))) +
# Styling
theme_minimal(base_size = 14) +
theme(
panel.background = element_rect(fill = "white", color = NA),
panel.grid.major.y = element_line(color = "grey80", linetype = "dotted"),
panel.grid.major.x = element_blank(),
legend.position = "top",
plot.background = element_rect(fill = "white", color = NA),
axis.text = element_text(color = "black"),
axis.title = element_text(color = "black")
)
# Convert to interactive plot
interactive_plot1 <- ggplotly(static_plot1, tooltip = "text") %>%
layout(
legend = list(
title = list(text = "Resource Type"),
orientation = "v"
),
showlegend = TRUE
)
# Rename legend items to clean labels
interactive_plot1$x$data <- lapply(interactive_plot1$x$data, function(trace) {
if (!is.null(trace$legendgroup)) {
trace$name <- gsub(",1", "", trace$name) # Remove ",1"
trace$name <- gsub("\\(", "", trace$name) # Remove "("
trace$name <- gsub("\\)", "", trace$name) # Remove ")"
}
trace
})
# Display interactive plot
interactive_plot1
Conclusion
The examination of production values and emissions trends across
different commodities reveals significant patterns in resource use,
industrial development, and environmental repercussions over time.
Coal, especially Bituminous and Thermal Coal, was essential during
the initial stages of industrialisation. Although its proportion in
total energy production has diminished, it continues to hold importance,
particularly in developing nations and state-driven energy frameworks.
Since the mid-20th century, oil and natural gas liquids have
consistently led in both production and emissions, largely due to their
key role in transportation, energy generation, and industrial processes.
Natural gas has emerged as a prominent alternative to coal, providing
cleaner energy with reduced emissions while maintaining increasing
production. Consequently, the period following World War II marked a
significant transition from coal to oil and gas as the primary energy
sources, influenced by technological progress, urbanisation, and
economic globalisation.
Emissions from state-controlled entities are predominantly reliant on
coal, reflecting extensive domestic energy initiatives aimed at ensuring
energy security and fostering economic growth. This dependence on coal
results in considerably higher emissions compared to those from
investor-owned firms. In contrast, private sector companies tend to
maintain a more diversified energy portfolio, drawing attention to oil
and gas due to their profitability and market demand. These companies
are also more adaptable to regulatory pressures, resulting in a lower
reliance on coal.
Emissions trends closely follow production patterns, with peaks in
coal-related emissions corresponding to the industrial expansion of the
mid-20th century, while oil and gas emissions reached their peaks later.
The gradual increase in natural gas production signifies its role as a
“transition fuel,” offering lower emissions than coal while still
contributing to overall carbon output.
The integrated analysis of production and emissions data underscores
the intricate nature of global resource consumption and its
environmental impacts. While there is a noticeable transition towards
cleaner energy sources, exemplified by the increased use of natural gas
and a reduction in coal dependency, this progress is inadequate to
achieve the overarching global climate objectives.
LS0tCnRpdGxlOiAiRW1pc3Npb25zX0RhdGEiCmF1dGhvcjogIlBhdWwgUmV1w58gJiBBcnNlbmlpIE1va3JvdiIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6ICczJwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAnMycKLS0tCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCgllY2hvID0gVFJVRSwKCW1lc3NhZ2UgPSBGQUxTRSwKCXdhcm5pbmcgPSBGQUxTRQopCm9wdGlvbnMoc2NpcGVuID0gMTUpCgpgYGAKCmBgYHtyIGxvYWQtd3JhbmdsZS1kYXRhLCBlY2hvID0gRkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRwbHlyKQoKCiNzb3VyY2VfZGF0YSA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFpbi9kYXRhLzIwMjQvMjAyNC0wNS0yMS9lbWlzc2lvbnMuY3N2JykKCiNTYW1lIGRhdGEsIGV4Y2VwdCBmb3IgY29udmVyc2lvbiBvZiAiY3ViaWMgRmVldCIgdG8gIkN1YmljIE1ldGVycyIgZm9yIGNsYXJpZmljYXRpb24gcHVycG9zZXMKZmlsZV9wYXRoIDwtICJ+L0Rlc2t0b3AvUl9Qcm9qZWN0L2VtaXNzaW9ucy5jc3YiIAplbWlzc2lvbnMgPC0gcmVhZC5jc3YoZmlsZV9wYXRoLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCkNvbXBhbnkgPC0gdW5pcXVlKGVtaXNzaW9uc1tjKCJwYXJlbnRfZW50aXR5IiwgInBhcmVudF90eXBlIiwgImNvbW1vZGl0eSIpXSkKCiNUb3BpYyAxIGRhdGEgV3JhbmdsZSBhbmQgUHJlcApwcm9kX3llYXJfc291cmNlX3JhdyA8LSB1bmlxdWUoZW1pc3Npb25zW2MoImNvbW1vZGl0eSIsICJ5ZWFyIiwgInByb2R1Y3Rpb25fdmFsdWUiKV0pCnByb2RfeWVhcl9zb3VyY2UgPC0gcHJvZF95ZWFyX3NvdXJjZV9yYXcgJT4lCiAgZ3JvdXBfYnkoY29tbW9kaXR5LCB5ZWFyKSAlPiUKICBzdW1tYXJpc2Uoc3VtX3Byb2RfdmFsID0gc3VtKHByb2R1Y3Rpb25fdmFsdWUpKQoKcHJvZF95ZWFyXzE5NDAgPC0gcHJvZF95ZWFyX3NvdXJjZSAlPiUKICBmaWx0ZXIoeWVhciA+PSAxOTQwICYgeWVhciA8PSAyMDIyKQoKcHJvZF95ZWFyX2V4YyA8LSBwcm9kX3llYXJfc291cmNlICU+JSAKICBmaWx0ZXIoeWVhciA+PSAxOTQwICYgeWVhciA8PSAyMDIyKSAlPiUKICBmaWx0ZXIoIWNvbW1vZGl0eSAlaW4lIGMoIk5hdHVyYWwgR2FzIiwgIk9pbCAmIE5HTCIpKQoKcHJvZF95ZWFyX3JhdyA8LSB1bmlxdWUoZW1pc3Npb25zW2MoInllYXIiLCAicHJvZHVjdGlvbl92YWx1ZSIpXSkKdG90YWxfcHJvZF95ZWFyIDwtIHByb2RfeWVhcl9yYXcgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKHN1bV9wcm9kX3ZhbCA9IHN1bShwcm9kdWN0aW9uX3ZhbHVlKSkKdG90YWxfcHJvZF95ZWFyJGNvbW1vZGl0eSA8LSBjKCJ0b3RhbCIpCgp0b3RhbF9wcm9kX2pvaW5lZCA8LSBiaW5kX3Jvd3MocHJvZF95ZWFyX3NvdXJjZSwgdG90YWxfcHJvZF95ZWFyKQoKc3VtX2RhdGFfMTkyMl9yYXcgPC0gdW5pcXVlKGVtaXNzaW9uc1tjKCJjb21tb2RpdHkiLCAieWVhciIsICJwcm9kdWN0aW9uX3ZhbHVlIildKQpzdW1fZGF0YV8xOTIyIDwtIHN1bV9kYXRhXzE5MjJfcmF3ICU+JQogIGdyb3VwX2J5KGNvbW1vZGl0eSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKHN1bV9wcm9kX3ZhbCA9IHN1bShwcm9kdWN0aW9uX3ZhbHVlKSkgJT4lCiAgZmlsdGVyKHllYXIgPj0gMTkwMCAmIHllYXIgPD0gMTkyMikKCnN1bV9kYXRhXzIwMjJfcmF3IDwtIHVuaXF1ZShlbWlzc2lvbnNbYygiY29tbW9kaXR5IiwgInllYXIiLCAicHJvZHVjdGlvbl92YWx1ZSIpXSkKc3VtX2RhdGFfMjAyMiA8LSBzdW1fZGF0YV8yMDIyX3JhdyAlPiUKICBncm91cF9ieShjb21tb2RpdHksIHllYXIpICU+JQogIHN1bW1hcmlzZShzdW1fcHJvZF92YWwgPSBzdW0ocHJvZHVjdGlvbl92YWx1ZSkpICU+JQogIGZpbHRlcih5ZWFyID49IDIwMDAgJiB5ZWFyIDw9IDIwMjIpCgojVG9waWMgMiBkYXRhIFdyYW5nbGUgYW5kIFByZXAKZW1pc3NfeWVhcl9zb3VyY2VfcmF3IDwtIHVuaXF1ZShlbWlzc2lvbnNbYygiY29tbW9kaXR5IiwgInllYXIiLCAidG90YWxfZW1pc3Npb25zX010Q08yZSIpXSkKZW1pc3NfeWVhcl9zb3VyY2UgPC0gZW1pc3NfeWVhcl9zb3VyY2VfcmF3ICU+JQogIGdyb3VwX2J5KGNvbW1vZGl0eSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKHN1bV9lbWlzc192YWwgPSBzdW0odG90YWxfZW1pc3Npb25zX010Q08yZSkpCgplbWlzc195ZWFyXzE5NTAgPC0gZW1pc3NfeWVhcl9zb3VyY2UgJT4lCiAgZmlsdGVyKHllYXIgPj0gMTk1MCAmIHllYXIgPD0gMjAyMikKCmVtaXNzX3llYXJfcmF3IDwtIHVuaXF1ZShlbWlzc2lvbnNbYygieWVhciIsICJ0b3RhbF9lbWlzc2lvbnNfTXRDTzJlIildKQp0b3RhbF9lbWlzc195ZWFyIDwtIGVtaXNzX3llYXJfcmF3ICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcmlzZShzdW1fZW1pc3NfdmFsID0gc3VtKHRvdGFsX2VtaXNzaW9uc19NdENPMmUpKQoKdG90YWxfZW1pc3NfeWVhciRjb21tb2RpdHkgPC0gYygidG90YWwiKQoKdG90YWxfZW1pc3Nfam9pbmVkIDwtIGJpbmRfcm93cyhlbWlzc195ZWFyX3NvdXJjZSwgdG90YWxfZW1pc3NfeWVhcikKCnRvdGFsX2VtaXNzX3Byb2QgPC0gYmluZF9yb3dzKHRvdGFsX2VtaXNzX3llYXIsIHRvdGFsX3Byb2RfeWVhcikgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHN1bV9wcm9kX3ZhbCwgc3VtX2VtaXNzX3ZhbCksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJjYXRlZ29yeSIsIAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICBmaWx0ZXIoIXZhbHVlICVpbiUgYyhOQSkpCgpgYGAKCiMgSW50cm9kdWN0aW9uCgpJbiBvdXIgUHJvamVjdCB3ZSB3YW50IHRvIHByZXNlbnQgYW5kIGNvbXBhcmUgcHJvZHVjdGlvbiBhbmQgZW1pc3Npb24gdmFsdWVzIG9mIGRpZmZlcmVudCBjb21wYW5pZXMgd2hpY2ggYXJlIGVpdGhlciBzdGF0ZSBvd25lZCwgaW52ZXN0b3Igb3duZWQgb3Igc28gY2FsbGVkICJuYXRpb24gc3RhdGUiIG93bmVkIG92ZXIgdGhlIHRpbWUgZnJhbWUgb2YgMTg1NCB1bnRpbCAyMDIyLiBUaGUgY29tcGFuaWVzIGluIHF1ZXN0aW9uIGFsbCBwcm9kdWNlIGRpZmZlcmVudCByZXNvdXJjZXMsIHNvbWUgb2Ygd2hpY2ggYXJlIG9pbCwgZ2FzLCBjZW1lbnQgYW5kIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgZm9ybXMgb2YgY29hbC4gSW4gc2hvcnQ6IFRoZXkgcHJvZHVjZSBmb3NzaWwgZnVlbCBhbmQgcmVsYXRlZCBtYXRlcmlhbHMuCgpFc3BlY2lhbGx5IGluIGEgbW9kZXJuIHdvcmxkIHdoZXJlIHRoZSBDTzIgZm9vdHByaW50IGlzIG9mIGltcG9ydGFuY2UgYW5kIHJlZHVjdGlvbiBvZiBDTzIgcHJvZHVjdGlvbiBpcyBlc3NlbnRpYWwgdG8gY29tcGx5IHdpdGggdGhlIGdvYWxzIHNldCBieSBsZWFkaW5nIHNjaWVudGlzdHMsIHRha2luZyBhIGxvb2sgYXQgaGlzdG9yaWNhbCBkYXRhIGNhbiB1bnJhdmVsIHNvbWUgdHJlbmRzIHRoYXQgY29udGludWUgdG8gdGhpcyBkYXRlLgoKIyMgVXNlZCBEYXRhCgpUaGUgZGF0YSB1c2VkIGZvciB0aGlzIHByb2plY3Qgc3RlbXMgZnJvbSB0aGUgR2l0SHViIFRpZHl0dWVzZGF5IHJlcG9zaXRvcnkgYW5kIHdhcyBjb2xsZWN0ZWQgYW5kIGNvbXBpbGVkIGJ5IENhcmJvbiBNYWpvcnMuIEluIHRoaXMgYW5hbHlzaXMsIHdlIHVzZWQgdGhlIG1lZGl1bSBncmFudWxhcml0eSBkYXRhc2V0LCB3aGljaCBpbmNsdWRlcyB5ZWFyLCBlbnRpdHksIGVudGl0eSB0eXBlLCBjb21tb2RpdHksIGNvbW1vZGl0eSBwcm9kdWN0aW9uLCBjb21tb2RpdHkgdW5pdCwgYW5kIHRvdGFsIGVtaXNzaW9ucyBidXQgZXhjbHVkZXMgdGhlIHJlcG9ydGluZyBlbnRpdHksIGRhdGEgcG9pbnQgc291cmNlLCBwcm9kdWN0IGVtaXNzaW9ucywgYW5kIHRoZSBmb3VyIGRpZmZlcmVudCBvcGVyYXRpb25hbCBlbWlzc2lvbnM6IGZsYXJpbmcsIHZlbnRpbmcsIG93biBmdWVsIHVzZSwgYW5kIGZ1Z2l0aXZlIG1ldGhhbmUuCgojIyBBbmFseXNlZCBDb21wYW5pZXMKClRoZSBmaXJzdCB0YWJsZSByZXZvbHZlcyBhcm91bmQgZGlmZmVyZW50IGNvbXBhbmllcyB3aGljaCBhcmUgcHJvZHVjaW5nIGRpZmZlcmVudCBjb21tb2RpdGllcyBhbmQgQ08yIC0gZW1pc3Npb25zLCB0aGVpciBvd25lcnNoaXAgYW5kIHRoZSB0eXBlIG9mIGNvbW1vZGl0eS4gSXQgcHJvdmlkZXMgYSBzaG9ydCBvdmVydmlldyBvZiBhbGwgdGhlIGFuYWx5emVkIGNvbXBhbmllcywgYnV0IGV4Y2x1ZGVzIG51bWVyaWNhbCBkYXRhIHBvaW50cyBhcyB0aG9zZSB3b3VsZCBiZSB0byB1bndpZWxkbHkuIEluIHRvdGFsLCAxMjIgY29tcGFuaWVzIHdlcmUgYW5hbHl6ZWQgaW4gdGhpcyBkYXRhc2V0LCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzZXZlbiBkaWZmZXJlbnQgY29tbW9kaXRpZXMuICAgCiAKYGBge3J9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShEVCkKCmRhdGF0YWJsZShDb21wYW55KQoKYGBgCgojIFJlc291cmNlIHByb2R1Y3Rpb24gRGF0YQpUaGUgZmlyc3QgY2hhcHRlciByZXZvbHZlcyBhcm91bmQgdGhlIHByb2R1Y3Rpb24gb2YgZWFjaCByZXNvdXJjZSBwZXIgeWVhci4gSW1wb3J0YW50IHRvIG5vdGUgaXMsIHRoYXQgbm90IGFsbCByZXNvdXJjZXMgd2VyZSBwcm9kdWNlZCBmcm9tIDE4NTQgb253YXJkcywgYnV0IHNvbWUgd2VyZSBvbmx5IGRpc2NvdmVyZWQgaW4gbGF0ZXIgeWVhcnMuIEFsc28sIHdoZW4gbG9va2luZyBhdCB0aGUgZGF0YSBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBkaWZmZXJlbnQgY29tbW9kaXRpZXMgd2VyZSBiZSBwcm9kdWNlZCBpbiBkaWZmZXJlbnQgdW5pdHMgYnV0IHN0aWxsIHBsb3R0ZWQgaW4gdGhlIHNhbWUgY2hhcnQuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgc2ltcGx5IHRvIGhpZ2hsaWdodCB0aGUgZGlmZmVyZW5jZSBpbiBwcm9kdWN0aW9uIGNhcGFjaXR5IG9mIGVhY2ggcmVzb3VyY2UgdHlwZSBwZXIgeWVhci4gVGhlIGRpZmZlcmVudCB1c2VkIG1ldHJpY3Mgd2VyZToKCjEuIENvYWwgYW5kIGNlbWVudCBwcm9kdWN0aW9uIHdlcmUgbWVhc3VyZWQgaW4gbWlsbGlvbiB0b25uZXMveWVhci4KCjIuIE5hdHVyYWwgR2FzIHByb2R1Y3Rpb24gd2FzIG1lYXN1cmVkIGluIGJjbS95ZWFyLgoKMy4gT2lsIHByb2R1Y3Rpb24gd2FzIG1lYXN1cmVkIGluIGJibC95ZWFyCgojIyBQcm9kdWN0aW9uIHBlciByZXNvdXJjZSB0eXBlCgpUaGUgZmlyc3QgZ3JhcGggaWxsdXN0cmF0ZXMgdGhlIGFubnVhbCBwcm9kdWN0aW9uIHZhbHVlcyBvZiB2YXJpb3VzIGNvbW1vZGl0aWVzIG92ZXIgdGltZSwgaGlnaGxpZ2h0aW5nIGtleSBpdGVtcyBzdWNoIGFzIGRpZmZlcmVudCBjb2FsIHR5cGVzIChBbnRocmFjaXRlLCBCaXR1bWlub3VzLCBTdWItQml0dW1pbm91cywgTGlnbml0ZSwgYW5kIFRoZXJtYWwgQ29hbCksIE5hdHVyYWwgR2FzLCBPaWwgJiBOR0wgKE5hdHVyYWwgR2FzIExpcXVpZHMpLCBhbmQgQ2VtZW50LiBUaGUgcHJvZHVjdGlvbiB2YWx1ZSBvZiBPaWwgJiBOR0wsIHJlcHJlc2VudGVkIGJ5IHRoZSB5ZWxsb3cgbGluZSwgZXhoaWJpdHMgYSBwcm9ub3VuY2VkIGluY3JlYXNlIGJlZ2lubmluZyBpbiB0aGUgbWlkLTIwdGggY2VudHVyeSwgZXN0YWJsaXNoaW5nIGl0IGFzIHRoZSBsZWFkaW5nIGNvbnRyaWJ1dG9yIHRvIGdsb2JhbCBlbmVyZ3kgYW5kIGluZHVzdHJpYWwgcHJvZHVjdGlvbi4KCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShwbG90bHkpCgogIGVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiVGhlcm1hbCBDb2FsIiA9ICIjRTMxMjBCIiwgICMgUmVkCiAgIkFudGhyYWNpdGUgQ29hbCIgPSAiIzZBMUI5QSIsCiAgIkxpZ25pdGUgQ29hbCIgPSAiI0ZGRUIzQiIsCiAgIkJpdHVtaW5vdXMgQ29hbCIgPSAiI0ZGNTcyMiIsCiAgIk1ldGFsbHVyZ2ljYWwgQ29hbCIgPSAiI0Y0QTZBMCIsCiAgIlN1Yi1CaXR1bWlub3VzIENvYWwiID0gIiM4QjQ1MTMiLAogICJPaWwgJiBOR0wiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJOYXR1cmFsIEdhcyIgPSAiIzAwOEY0NyIsICAgIyBHcmVlbgogICJDZW1lbnQiID0gIiNBNUE1QTUiICAjIEdyZXkKICApCgpwcm9kX3llYXJfc291cmNlJGNvbW1vZGl0eSA8LSBmYWN0b3IocHJvZF95ZWFyX3NvdXJjZSRjb21tb2RpdHksIGxldmVscyA9IG5hbWVzKGVjb25vbWlzdF9jb2xvcnMpKQoKIyBQbG90IHVzaW5nIHBsb3RseQpwbG90X2x5KHByb2RfeWVhcl9zb3VyY2UsIHggPSB+eWVhciwgeSA9IH5zdW1fcHJvZF92YWwsIGNvbG9yID0gfmNvbW1vZGl0eSwgCiAgICAgICAgY29sb3JzID0gZWNvbm9taXN0X2NvbG9ycywgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycpICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIlByb2R1Y3Rpb24gdmFsdWUgcGVyIHllYXIgcGVyIHJlc291cmNlIHR5cGUiLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQcm9kdWN0aW9uIFZhbHVlIiksCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSkKICApCmBgYApEdXJpbmcgdGhpcyB0aW1lZnJhbWUsIGxpc3RlZCBjb21tb2RpdGllcywgcGFydGljdWxhcmx5IG9pbCwgbmF0dXJhbCBnYXMsIGFuZCBjb2FsLCBleHBlcmllbmNlZCBzdWJzdGFudGlhbCBncm93dGggaW4gcHJvZHVjdGlvbiB2YWx1ZSwgcGFyYWxsZWxpbmcgdGhlIGVjb25vbWljIGV4cGFuc2lvbiwgaW5kdXN0cmlhbGlzYXRpb24sIGFuZCB1cmJhbmlzYXRpb24gdGhhdCBmb2xsb3dlZCBXb3JsZCBXYXIgSUkuIFRoZSBwcmVlbWluZW5jZSBvZiBvaWwgZnJvbSB0aGUgbWlkLTIwdGggY2VudHVyeSBvbndhcmQgdW5kZXJzY29yZXMgaXRzIGNyaXRpY2FsIGltcG9ydGFuY2UgaW4gZW5lcmd5IGdlbmVyYXRpb24sIHRyYW5zcG9ydGF0aW9uLCBhbmQgaW5kdXN0cmlhbCBhcHBsaWNhdGlvbnMuIE5vdGFibHksIEJpdHVtaW5vdXMgQ29hbCAoYnJvd24gbGluZSkgYW5kIFRoZXJtYWwgQ29hbCAoZ3JheSBsaW5lKSBkZW1vbnN0cmF0ZWQgc2lnbmlmaWNhbnQgZ3Jvd3RoIHRocm91Z2hvdXQgdGhlIGluZHVzdHJpYWxpc2F0aW9uIGVyYSAoMTkwMOKAkzE5NTApLCByZWFjaGluZyBwZWFrcyBpbiB0aGUgbWlkIHRvIGxhdGUgMjB0aCBjZW50dXJ5LCB3aGljaCBjb3JyZXNwb25kcyB3aXRoIHRoZSBleHRlbnNpdmUgdXRpbGlzYXRpb24gb2YgY29hbCBmb3IgZWxlY3RyaWNpdHkgZ2VuZXJhdGlvbiBhbmQgaGVhdnkgaW5kdXN0cnkuCgoKIyMgUHJvZHVjdGlvbiB2YWx1ZXMgZnJvbSAxOTQwIHRvIDIwMjIKClRoaXMgcmV2aXNlZCBncmFwaCBlbXBoYXNpc2VzIHRoZSBwcm9kdWN0aW9uIHZhbHVlcyBvZiB2YXJpb3VzIGNvbW1vZGl0aWVzIGZyb20gMTk0MCBvbndhcmQuIFRoZSBwcm9kdWN0aW9uIHZhbHVlIG9mIE9pbCAmIE5HTCAoeWVsbG93IGxpbmUpIHNob3dzIGEgcmVtYXJrYWJsZSBzdXJnZSBwb3N0LTE5NDAsIHN1cnBhc3NpbmcgYWxsIG90aGVyIGNvbW1vZGl0aWVzIGJ5IHRoZSBsYXRlIDIwdGggY2VudHVyeSwgaW5kaWNhdGl2ZSBvZiB0aGUgaW5jcmVhc2luZyBnbG9iYWwgcmVsaWFuY2Ugb24gb2lsIGZvciB0cmFuc3BvcnRhdGlvbiwgaW5kdXN0cmlhbCBhY3Rpdml0aWVzLCBhbmQgZW5lcmd5IGdlbmVyYXRpb24uIFRoaXMgdHJlbmQgb2YgaGlnaCBwcm9kdWN0aW9uIHZhbHVlIHBlcnNpc3RzIGludG8gdGhlIDIxc3QgY2VudHVyeS4gRm9sbG93aW5nIDE5NDAsIHRoZSBnbG9iYWwgZW5lcmd5IGxhbmRzY2FwZSB1bmRlcndlbnQgYSBncmFkdWFsIHRyYW5zaXRpb24gZnJvbSBjb2FsIHRvIG9pbCBhbmQgZ2FzLCBwcm9wZWxsZWQgYnkgdGVjaG5vbG9naWNhbCBpbm5vdmF0aW9ucywgZWNvbm9taWMgZGV2ZWxvcG1lbnQsIGFuZCBhIHJpc2luZyBkZW1hbmQgZm9yIGxpcXVpZCBmdWVscyBhbmQgY2xlYW5lciBlbmVyZ3kgYWx0ZXJuYXRpdmVzLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZHBseXIpCgogIGVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiVGhlcm1hbCBDb2FsIiA9ICIjRTMxMjBCIiwgICMgUmVkCiAgIkFudGhyYWNpdGUgQ29hbCIgPSAiIzZBMUI5QSIsCiAgIkxpZ25pdGUgQ29hbCIgPSAiI0ZGRUIzQiIsCiAgIkJpdHVtaW5vdXMgQ29hbCIgPSAiI0ZGNTcyMiIsCiAgIk1ldGFsbHVyZ2ljYWwgQ29hbCIgPSAiI0Y0QTZBMCIsCiAgIlN1Yi1CaXR1bWlub3VzIENvYWwiID0gIiM4QjQ1MTMiLAogICJPaWwgJiBOR0wiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJOYXR1cmFsIEdhcyIgPSAiIzAwOEY0NyIsICAgIyBHcmVlbgogICJDZW1lbnQiID0gIiNBNUE1QTUiICAjIEdyZXkKICApCgpwcm9kX3llYXJfMTk0MCRjb21tb2RpdHkgPC0gZmFjdG9yKHByb2RfeWVhcl8xOTQwJGNvbW1vZGl0eSwgbGV2ZWxzID0gbmFtZXMoZWNvbm9taXN0X2NvbG9ycykpCgojUGxvdCAxOTQwIG9ud2FyZHMgZm9yIHNob3djYXNpbmcgaW5jcmVhc2UgYWZ0ZXIgSW5kdXN0cmlhbGlzYXRpb24KcGxvdF9seShwcm9kX3llYXJfMTk0MCwgeCA9IH55ZWFyLCB5ID0gfnN1bV9wcm9kX3ZhbCwgY29sb3IgPSB+Y29tbW9kaXR5LCBjb2xvcnMgPSBlY29ub21pc3RfY29sb3JzLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJykgJT4lCiAgbGF5b3V0KAogICAgdGl0bGUgPSAiUHJvZHVjdGlvbiBwZXIgeWVhciBwZXIgcmVzb3VyY2UgdHlwZSBmcm9tIDE5NDAiLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJwcm9kdWN0aW9uIHZhbHVlIiksCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSkKICApCmBgYAojIyBQcm9kdWN0aW9uIFZhbHVlcyB3aXRob3V0IE9pbCwgTkdMIGFuZCBHYXMKClRoaXMgZ3JhcGggaWxsdXN0cmF0ZXMgdGhlIGFubnVhbCBwcm9kdWN0aW9uIHZhbHVlIG9mIHZhcmlvdXMgY29tbW9kaXRpZXMsIGV4Y2x1ZGluZyBPaWwsIE5HTCwgYW5kIEdhcywgdGhlcmVieSBvZmZlcmluZyBhIG1vcmUgZm9jdXNlZCBwZXJzcGVjdGl2ZSBvbiByZXNvdXJjZXMgc3VjaCBhcyBjb2FsIGluIGl0cyB2YXJpb3VzIGZvcm1zLCBjZW1lbnQsIGFuZCBtZXRhbGx1cmdpY2FsIHByb2R1Y3RzLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZHBseXIpCgogIGVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiVGhlcm1hbCBDb2FsIiA9ICIjRTMxMjBCIiwgICMgUmVkCiAgIkFudGhyYWNpdGUgQ29hbCIgPSAiIzZBMUI5QSIsCiAgIkxpZ25pdGUgQ29hbCIgPSAiI0ZGRUIzQiIsCiAgIkJpdHVtaW5vdXMgQ29hbCIgPSAiI0ZGNTcyMiIsCiAgIk1ldGFsbHVyZ2ljYWwgQ29hbCIgPSAiI0Y0QTZBMCIsCiAgIlN1Yi1CaXR1bWlub3VzIENvYWwiID0gIiM4QjQ1MTMiLAogICJPaWwgJiBOR0wiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJOYXR1cmFsIEdhcyIgPSAiIzAwOEY0NyIsICAgIyBHcmVlbgogICJDZW1lbnQiID0gIiNBNUE1QTUiICAjIEdyZXkKICApCgpwcm9kX3llYXJfMTk0MCRjb21tb2RpdHkgPC0gZmFjdG9yKHByb2RfeWVhcl8xOTQwJGNvbW1vZGl0eSwgbGV2ZWxzID0gbmFtZXMoZWNvbm9taXN0X2NvbG9ycykpCiNQbG90IGFsbCBjb21tb2RpdGllcyBleGNsdWRpbmcgR2FzIGFuZCBPaWwgZHVlIHR1IG92ZXJ3aGVsbWluZyBzdXBlcmlvcml0eQpwbG90X2x5KHByb2RfeWVhcl9leGMsIHggPSB+eWVhciwgeSA9IH5zdW1fcHJvZF92YWwsIGNvbG9yID0gfmNvbW1vZGl0eSwgY29sb3JzID0gZWNvbm9taXN0X2NvbG9ycywgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycpICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIlByb2R1Y3Rpb24gdmFsdWUgcGVyIHllYXIgcGVyIHJlc291cmNlIHR5cGUgZXhjbHVkaW5nIE9pbCwgTkdMIGFuZCBHYXMiLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJwcm9kdWN0aW9uIHZhbHVlIiksCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSkKICApCmBgYApBIGNvbXByZWhlbnNpdmUgYW5hbHlzaXMgb2YgdGhlIG9ic2VydmVkIHRyZW5kcyBzaG93czoKCjEuIOKBoCDigaBBbW9uZyB0aGUgZXhjbHVkZWQgY29tbW9kaXRpZXMsIEJpdHVtaW5vdXMgY29hbCBzdGFuZHMgb3V0IGFzIHRoZSBsZWFkaW5nIHByb2R1Y3QsIGV4cGVyaWVuY2luZyBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIHByb2R1Y3Rpb24gYmVnaW5uaW5nIGluIHRoZSAxOTYwcywgcmVhY2hpbmcgaXRzIHBlYWsgYXJvdW5kIDIwMTAsIGZvbGxvd2VkIGJ5IGEgc2xpZ2h0IGRlY2xpbmUuIFRoaXMgdHJlbmQgdW5kZXJzY29yZXMgaXRzIG9uZ29pbmcgcmVsZXZhbmNlIGluIGVuZXJneSBnZW5lcmF0aW9uIGFuZCBpbmR1c3RyaWFsIGFwcGxpY2F0aW9ucywgcGFydGljdWxhcmx5IGluIGRldmVsb3BpbmcgbmF0aW9ucyB0aGF0IGRlcGVuZCBvbiBjb2FsLWZpcmVkIHBvd2VyIGZhY2lsaXRpZXMuCgoyLiAg4oGgVGhlIHByb2R1Y3Rpb24gdmFsdWUgb2YgY2VtZW50IGhhcyBzZWVuIHN1YnN0YW50aWFsIGdyb3d0aCBzaW5jZSB0aGUgMTk4MHMsIHdpdGggYSBub3RhYmxlIGFjY2VsZXJhdGlvbiBpbiB0aGUgMjAwMHMuIFRoaXMgc3VyZ2UgaXMgYSBtYXJrIG9mIGEgZ2xvYmFsIGluZnJhc3RydWN0dXJlIGFuZCBjb25zdHJ1Y3Rpb24gYm9vbSwgYXMgd2VsbCBhcyByYXBpZCB1cmJhbmlzYXRpb24gYW5kIGluZHVzdHJpYWxpc2F0aW9uIGluIGRldmVsb3BpbmcgY29udHJpZXMuCgozLiAg4oGgVGhlcm1hbCBjb2FsIGRpc3BsYXlzIGEgZ3JhZHVhbCBpbmNyZWFzZSBzaW11bGFyIHRvIHRoYXQgb2YgQml0dW1pbm91cyBjb2FsLCBhbHRob3VnaCBpdCBtYWludGFpbnMgYSBsb3dlciBvdmVyYWxsIHByb2R1Y3Rpb24gdmFsdWUsIHJlZmxlY3RpbmcgaXRzIHNwZWNpZmljIGFwcGxpY2F0aW9ucyB3aXRoaW4gY2VydGFpbiBlbmVyZ3kgc2VjdG9ycy4KCjQuICDigaBUaGUgcHJvZHVjdGlvbiBvZiBtZXRhbGx1cmdpY2FsIGNvYWwgaGFzIHNob3duIGNvbnNpc3RlbnQgZ3Jvd3RoLCBjbG9zZWx5IGxpbmtlZCB0byBhZHZhbmNlbWVudHMgaW4gaW5mcmFzdHJ1Y3R1cmUgYW5kIGluZHVzdHJpYWwgZGV2ZWxvcG1lbnQuCgo1LiAg4oGgSW4gY29udHJhc3QsIExpZ25pdGUgY29hbCBoYXMgZXhwZXJpZW5jZWQgbGltaXRlZCBncm93dGggcmVsYXRpdmUgdG8gb3RoZXIgY29hbCB0eXBlcywgd2hpY2ggY2FuIGJlIGF0dHJpYnV0ZWQgdG8gaXRzIHNwZWNpYWxpc2VkIGFwcGxpY2F0aW9ucy4KCjYuICDigaBCb3RoIEFudGhyYWNpdGUgQ29hbCBhbmQgU3ViLUJpdHVtaW5vdXMgQ29hbCByZXZlYWwgcmVsYXRpdmVseSBzdGFibGUgdHJlbmRzLCBzdWdnZXN0aW5nIGxvd2VyIHByb2R1Y3Rpb24gdmFsdWVzIGFuZCBtaW5pbWFsIGdyb3d0aCB3aGVuIGNvbXBhcmVkIHRvIG90aGVyIGNvbW1vZGl0aWVzLgoKVGhlc2Ugb2JzZXJ2YXRpb25zIGluZGljYXRlIHRoYXQsIGRlc3BpdGUgYSBnbG9iYWwgbW92ZW1lbnQgdG93YXJkcyBjbGVhbmVyIGVuZXJneSBzb3VyY2VzLCBjb2FsLCBwYXJ0aWN1bGFybHkgQml0dW1pbm91cyBhbmQgVGhlcm1hbCBDb2FsLCBjb250aW51ZXMgdG8gcGxheSBhIGNydWNpYWwgcm9sZSBpbiBudW1lcm91cyBlY29ub21pZXMuIEFkZGl0aW9uYWxseSwgdGhlIGdyb3d0aCBpbiBjZW1lbnQgcHJvZHVjdGlvbiByZWZsZWN0cyBhbiBvbmdvaW5nIGRlbWFuZCBmb3IgY29uc3RydWN0aW9uIG1hdGVyaWFscywgZHJpdmVuIGJ5IHVyYmFuaXNhdGlvbiwgaW5kdXN0cmlhbGlzYXRpb24gYW5kIGluZnJhc3RydWN0dXJlIGluaXRpYXRpdmVzLiBIb3dldmVyLCB0aGUgcmVsYXRpdmVseSBzdGFibGUgdHJlbmRzIGZvciBjZXJ0YWluIGNvYWwgdHlwZXMgYW5kIG1ldGFsbHVyZ2ljYWwgcHJvZHVjdHMgaW1wbHkgYSBwb3RlbnRpYWwgc2hpZnQgaW4gcmVzb3VyY2UgcHJpb3JpdGllcyBvdmVyIHRpbWUsIHdpdGggYSBmb2N1cyBvbiBtYXRlcmlhbHMgdGhhdCBhcmUgaW4gaGlnaGVyIGRlbWFuZCBhbmQgb2ZmZXIgZ3JlYXRlciB2ZXJzYXRpbGl0eS4KCiMjIFByb2R1Y3Rpb24gdmFsdWVzIGluY2x1ZGluZyB0b3RhbCBwcm9kdWN0aW9uCgpUb3RhbCBQcm9kdWN0aW9uIFZhbHVlOiBTaW5jZSB0aGUgbWlkLTIwdGggY2VudHVyeSwgdGhlcmUgaGFzIGJlZW4gYSBzaWduaWZpY2FudCBpbmNyZWFzZSBpbiB0b3RhbCBwcm9kdWN0aW9uIHZhbHVlLCB0aGF0IHNlcnZlcyBhcyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBvdmVyYWxsIGdyb3d0aCBvZiB2YXJpb3VzIHJlc291cmNlcy4gVGhpcyBpbmNyZWFzZSBpcyBwcmltYXJpbHkgYXR0cmlidXRlZCB0byBPaWwgJiBOR0wgYW5kIE5hdHVyYWwgR2FzLCB3aGljaCBhcmUgdGhlIHByZWRvbWluYW50IGNvbnRyaWJ1dG9ycyB0byB0aGUgdG90YWwuIEl0IGlzIGVzc2VudGlhbCB0byBub3RlLCB0aGF0IHRoZSBjb21iaW5lZCB1bml0cyB2YXJpZWQsIG1lYW5pbmcgdGhhdCB0aGUgZmlndXJlIGRvZXMgbm90IHJlZmxlY3QgYW4gZXhhY3QgdmFsdWUgYnV0IHJhdGhlciBpbGx1c3RyYXRlcyB0aGUgZ2VuZXJhbCB0cmVuZCBvdmVyIHRoZSB5ZWFycy4KYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZHBseXIpCgogIGVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiVGhlcm1hbCBDb2FsIiA9ICIjRTMxMjBCIiwgICMgUmVkCiAgIkFudGhyYWNpdGUgQ29hbCIgPSAiIzZBMUI5QSIsCiAgIkxpZ25pdGUgQ29hbCIgPSAiI0ZGRUIzQiIsCiAgIkJpdHVtaW5vdXMgQ29hbCIgPSAiI0ZGNTcyMiIsCiAgIk1ldGFsbHVyZ2ljYWwgQ29hbCIgPSAiI0Y0QTZBMCIsCiAgIlN1Yi1CaXR1bWlub3VzIENvYWwiID0gIiM4QjQ1MTMiLAogICJPaWwgJiBOR0wiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJOYXR1cmFsIEdhcyIgPSAiIzAwOEY0NyIsICAgIyBHcmVlbgogICJDZW1lbnQiID0gIiNGNUY1REMiLCAgIyBHcmV5CiAgInRvdGFsIiA9ICIjQTVBNUE1IgogICkKCnByb2RfeWVhcl8xOTQwJGNvbW1vZGl0eSA8LSBmYWN0b3IocHJvZF95ZWFyXzE5NDAkY29tbW9kaXR5LCBsZXZlbHMgPSBuYW1lcyhlY29ub21pc3RfY29sb3JzKSkKCgojUGxvdCBhbGwgY29tbW9kaXRpZXMgaW5jbHVkaW5nIHRvdGFsIHByb2R1Y3Rpb24KcGxvdF9seSh0b3RhbF9wcm9kX2pvaW5lZCwgeCA9IH55ZWFyLCB5ID0gfnN1bV9wcm9kX3ZhbCwgY29sb3IgPSB+Y29tbW9kaXR5LCBjb2xvcnMgPSBlY29ub21pc3RfY29sb3JzLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJykgJT4lCiAgbGF5b3V0KAogICAgdGl0bGUgPSAiUHJvZHVjdGlvbiB2YWx1ZSBwZXIgeWVhciBwZXIgcmVzb3VyY2UgdHlwZSBpbmNsdWRpbmcgdG90YWwiLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJwcm9kdWN0aW9uIHZhbHVlIiksCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSkKICApCgpgYGAKIyBDb21wYXJpc29uIG9mIHByb2R1Y3Rpb24gYmV0d2VlbiBlYXJseSAyMHRoIGFuZCAyMXN0IGNlbnR1cnkKClRoZXNlIGNoYXJ0cyBpbGx1c3RyYXRlIHRoZSBzdW1tYXJpemVkIHByb2R1Y2VkIGNvbW1vZGl0aWVzIGluIDE5MDAgLSAxOTIyIGFnYWluc3QgMjAwMCAtIDIwMjIuIFRoZXkgc2hvd2Nhc2UgdGhlIHByb2dyZXNzIGluIHByb2R1Y3Rpb24gdGhhdCBoYXMgYmVlbiBhY2hpZXZlZCBpbiB0aGUgbGFzdCBjZW50dXJ5IG1hZ25pZnlpbmcgdGhlIGVub3Jtb3VzIGNoYW5nZSB0aGF0IGhhcyBoYXBwZW5lZC4gRXNwZWNpYWxseSB3aGVuIHRha2luZyBhIGNsb3NlciBsb29rIGF0IHRoZSBwZXJjZW50YWdlIGNoYW5nZSBiZXR3ZWVuIHRoZSBwcm9kdWN0aW9uIGluIHRoZSAyMHRoIGNlbnR1cnkgY29tcGFyZWQgdG8gdGhlIDIxc3QgY2VudHVyeSwgYSBjbGVhciBzaGlmdCBhd2F5IGZyb20gY29hbCBhbmQgdG93YXJkcyBPaWwgYW5kIE5HTCBjYW4gYmUgb2JzZXJ2ZWQuCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShwbG90bHkpIAogICAgICAgIAojMS4gQWdncmVnYXRlIHRoZSBkYXRhCnN1bV9kYXRhXzE5MjJfMSA8LSBzdW1fZGF0YV8xOTIyICU+JQogIGdyb3VwX2J5KGNvbW1vZGl0eSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX3Byb2R1Y3Rpb24gPSBzdW0oc3VtX3Byb2RfdmFsLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZHVjdGlvbikpCgojIDIuIFNlbGVjdCB0aGUgdG9wIDggY29tbW9kaXRpZXMKdG9wX2NvbW1vZGl0aWVzIDwtIHN1bV9kYXRhXzE5MjJfMSAlPiUgCiAgc2xpY2VfaGVhZChuID0gOCkKCiMgQ2FsY3VsYXRlIHBlcmNlbnRhZ2VzCnRvcF9jb21tb2RpdGllcyA8LSB0b3BfY29tbW9kaXRpZXMgJT4lCiAgbXV0YXRlKHBlcmNlbnQgPSB0b3RhbF9wcm9kdWN0aW9uIC8gc3VtKHRvdGFsX3Byb2R1Y3Rpb24pICogMTAwKQoKIyAzLiBDcmVhdGUgdGhlIGludGVyYWN0aXZlIHBpZSBjaGFydApwaWVfY2hhcnQgPC0gcGxvdF9seSgKICBkYXRhID0gdG9wX2NvbW1vZGl0aWVzLAogIGxhYmVscyA9IH5jb21tb2RpdHksCiAgdmFsdWVzID0gfnRvdGFsX3Byb2R1Y3Rpb24sCiAgdHlwZSA9ICdwaWUnLAogIHRleHRpbmZvID0gJ2xhYmVsK3BlcmNlbnQnLCAgICAgICAjIERpc3BsYXkgYm90aCBsYWJlbCBhbmQgcGVyY2VudCBvbiB0aGUgcGllCiAgaW5zaWRldGV4dG9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnLCAjIE1ha2UgdGV4dCBpbnNpZGUgaG9yaXpvbnRhbAogIGhvdmVyaW5mbyA9ICdsYWJlbCtwZXJjZW50K3ZhbHVlJywgIyBUb29sdGlwIHNob3dzIGxhYmVsLCBwZXJjZW50LCBhbmQgdmFsdWUKICBtYXJrZXIgPSBsaXN0KGNvbG9ycyA9IGNvbG9yUmFtcFBhbGV0dGUoYygKICAiIzAwNTZBMyIsICAgICAgIyBOYXR1cmFsIEdhcwogICIjRkY1NzIyIiwgICAgICAgIyBPaWwgJiBOR0wKICAiIzAwOEY0NyIsICAgICAjIEJpdHVtaW5vdXMgY29hbAogICIjRkYwMDAwIiwgICAgICAgIyBDZW1lbnQKICAibGlnaHRibHVlIiwgICMgTWV0YWxsdXJnaWNhbCBDb2FsCiAgIiNGRkVCM0IiLCAjIFN1YiAtIEJpdHVtaW5vdXMgY29hbAogICJncmV5IiwgICAgICAgICMgTGlnbml0ZSBDb2FsCiAgInB1cnBsZSIsICAgICAjIFRoZXJtYWwgQ29hbAogICJwaW5rIiAgICAgICAgIyBBbnRocmFjaXRlIENvYWwKKSkoOCkpICMgQ3VzdG9tIGNvbG9ycwopICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIlRvcCA4IENvbW1vZGl0aWVzIGJ5IFRvdGFsIFByb2R1Y3Rpb24iLAogICAgc2hvd2xlZ2VuZCA9IFRSVUUsCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInJlc291cmNlIHR5cGUiKSksCiAgICBtYXJnaW4gPSBsaXN0KGwgPSA1MCwgciA9IDUwLCB0ID0gNTAsIGIgPSA1MCkgIyBBZGQgcGFkZGluZyBmb3IgbGFiZWxzCiAgKQoKIyBEaXNwbGF5IHRoZSBwaWUgY2hhcnQKcGllX2NoYXJ0CmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBsb3RseSkgCiAgICAgICAgCiMxLiBBZ2dyZWdhdGUgdGhlIGRhdGEKc3VtX2RhdGFfMjAyMl8xIDwtIHN1bV9kYXRhXzIwMjIgJT4lCiAgZ3JvdXBfYnkoY29tbW9kaXR5KSAlPiUKICBzdW1tYXJpc2UodG90YWxfcHJvZHVjdGlvbiA9IHN1bShzdW1fcHJvZF92YWwsIG5hLnJtID0gVFJVRSkpICU+JQogIGFycmFuZ2UoZGVzYyh0b3RhbF9wcm9kdWN0aW9uKSkKCiMgMi4gU2VsZWN0IHRoZSB0b3AgOCBjb21tb2RpdGllcwp0b3BfY29tbW9kaXRpZXMgPC0gc3VtX2RhdGFfMjAyMl8xICU+JSAKICBzbGljZV9oZWFkKG4gPSA5KQoKIyBDYWxjdWxhdGUgcGVyY2VudGFnZXMKdG9wX2NvbW1vZGl0aWVzIDwtIHRvcF9jb21tb2RpdGllcyAlPiUKICBtdXRhdGUocGVyY2VudCA9IHRvdGFsX3Byb2R1Y3Rpb24gLyBzdW0odG90YWxfcHJvZHVjdGlvbikgKiAxMDApCgojIDMuIENyZWF0ZSB0aGUgaW50ZXJhY3RpdmUgcGllIGNoYXJ0CnBpZV9jaGFydDIgPC0gcGxvdF9seSgKICBkYXRhID0gdG9wX2NvbW1vZGl0aWVzLAogIGxhYmVscyA9IH5jb21tb2RpdHksCiAgdmFsdWVzID0gfnRvdGFsX3Byb2R1Y3Rpb24sCiAgdHlwZSA9ICdwaWUnLAogIHRleHRpbmZvID0gJ2xhYmVsK3BlcmNlbnQnLCAgICAgICAjIERpc3BsYXkgYm90aCBsYWJlbCBhbmQgcGVyY2VudCBvbiB0aGUgcGllCiAgaW5zaWRldGV4dG9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnLCAjIE1ha2UgdGV4dCBpbnNpZGUgaG9yaXpvbnRhbAogIGhvdmVyaW5mbyA9ICdsYWJlbCtwZXJjZW50K3ZhbHVlJywgIyBUb29sdGlwIHNob3dzIGxhYmVsLCBwZXJjZW50LCBhbmQgdmFsdWUKICBtYXJrZXIgPSBsaXN0KGNvbG9ycyA9IGNvbG9yUmFtcFBhbGV0dGUoYygKICAiIzAwOEY0NyIsICAgICAgIyBOYXR1cmFsIEdhcwogICIjMDA1NkEzIiwgICAgICAgIyBPaWwgJiBOR0wKICAiI0ZGNTcyMiIsICAgICAjIEJpdHVtaW5vdXMgY29hbAogICIjODFDNzg0IiwgICAgICAgIyBDZW1lbnQKICAiI0ZGRUIzQiIsICAjIE1ldGFsbHVyZ2ljYWwgQ29hbAogICJsaWdodGJsdWUiLCAjIFN1YiAtIEJpdHVtaW5vdXMgY29hbAogICJncmV5IiwgICAgICAgICMgTGlnbml0ZSBDb2FsCiAgIiNGRjAwMDAiLCAgICAgIyBUaGVybWFsIENvYWwKICAicGluayIsICAgICAgICAjIEFudGhyYWNpdGUgQ29hbAogICJwdXJwbGUiCikpKDkpKSAjIEN1c3RvbSBjb2xvcnMKKSAlPiUKICBsYXlvdXQoCiAgICB0aXRsZSA9ICJUb3AgOSBDb21tb2RpdGllcyBieSBUb3RhbCBQcm9kdWN0aW9uIiwKICAgIHNob3dsZWdlbmQgPSBUUlVFLAogICAgbGVnZW5kID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJyZXNvdXJjZSB0eXBlIikpLAogICAgbWFyZ2luID0gbGlzdChsID0gNTAsIHIgPSA1MCwgdCA9IDUwLCBiID0gNTApICMgQWRkIHBhZGRpbmcgZm9yIGxhYmVscwogICkKCiMgRGlzcGxheSB0aGUgcGllIGNoYXJ0CnBpZV9jaGFydDIKYGBgCkhvd2V2ZXIsIHRoZSBzaG93Y2FzZWQgcGVyY2VudGFnZSBwb2ludHMgYW5kIHRodXMgdGhlIGluZGljYXRlZCBsb3dlciBwcm9kdWN0aW9uIG9mIGFsbCBjb21tb2RpdGllcyByZXZvbHZpbmcgYXJyb3VuZCBjb2FsIGFyZSBtaXNsZWFkaW5nIGR1ZSB0byB0aGUgZXhwb25lbnRpYWwgaW5jcmVhc2UgaW4gdG90YWwgcHJvZHVjdGlvbiB0aGF0IG9jY3VycmVkIG92ZXIgdGhlIGxhc3QgY2VudHVyeS4gQXMgYSBtYXR0ZXIgb2YgZmFjdCwgdGhlIGNvYWwgcHJvZHVjdGlvbiBkaWQgaW5jcmVhc2UgZnJvbSB0aGUgMjB0aCB0b3dhcmRzIHRoZSAyMXN0IGNlbnR1cnkuIEhvd2V2ZXIgaXQganVzdCBkaWQgbm90IGluY3JlYXNlIGluIGV4cG9uZW50aWFsIGZhc2hpb24gYnV0IG1vcmUgbGluZWFyLiBUaHVzLCBhIG1vcmUgZGV0YWlsZWQgYW5hbHlzaXMgc2hvd3M6CgoxLiBUaGUgcGVyY2VudGFnZSBvZiBPaWwgYW5kIE5HTCBwcm9kdWN0aW9uIGlzIGxvd2VyIGluIDIxc3QgY2VudHVyeSBjb21wYXJlZCB0byB0aGUgMjB0aCBjZW50dXJ5LiBUaGlzIGJ5IG5vIG1lYW5zIHNheXMsIHRoYXQgdGhlIHRvdGFsIHByb2R1Y3Rpb24gaXMgcmVkdWNlZCwgYnV0IGl0IHNob3djYXNlcyBqdXN0IGhvdyBtdWNoIG5hdHVyYWwgR2FzIGlzIHByb2R1Y2VkIHRvIHRoaXMgZGF5LiAKCjIuIE9pbCwgTkdMICYgR2FzIG1ha2UgdXAgODcuMiAlIG9mIGFsbCBwcm9kdWNlZCBjb21tb2RpdGllcyBpbiAyMXN0IGNlbnR1cnkgc2hvd2Nhc2luZyB0aGVpciByZWxldmFuY2UgdG9kYXksIHdoaWxlIGJhY2sgaW4gdGhlIDIwdGggY2VudHVyeSwgcHJvZHVjdGlvbiB3YXMgbW9yZSBkaXZlcnNlIHdpdGggZm91ciBtYWpvciBwbGF5ZXJzLiBBbGwgb2YgdGhvc2UgbWFqb3IgcGxheWVycyBwYXJ0aWNpcGF0aW5nIG92ZXIgMTAlIHdpdGggdHdvIG9mIHdoaWNoIGV2ZW4gcGFydGljaXBhdGluZyBvdmVyIDIwJSB0byB0aGUgdG90YWwgcHJvZHVjdGlvbi4gV2hlbiBjb21wYXJpbmcgdGhlIGNoYXJ0cyBpdCBiZWNvbWVzIGNsZWFyIHRoYXQsIE9pbCBhbmQgTkdMIHdlcmUgZG9taW5hdGluZyBhbHJlYWR5IGFuZCBjb250aW51ZWQgdGhlaXIgZG9taW5hbmNlLCB3aGlsc3QgYml0dW1pbm91cyBjb2FsIGhhcyBsb3N0IGFsbW9zdCAyMCAlLiBOYXR1cmFsIGdhcyBoYXMgY2xlYXJseSByaXNlbiBmcm9tIDEyLjUlIHRvIG1vc3QgcHJvZHVjZWQgY29tbW9kaXR5IHdpdGggYSB0b3RhbCBvZiA0NSAlLgoKMy4gVGhlIG1ham9yaXR5IG9mIGNvYWwgY2xhc3NlcyBuZXZlciBzaG93ZWQgYSBodWdlIHBlcmNlbnRhZ2Ugb2YgdG90YWwgcHJvZHVjdGlvbiBhbmQgZGlkIGFsc28gbm90IGNhdGNoIHVwLCB3aGlsc3Qgc29tZSBldmVuIGxvc3QgcmVsZXZhbmNlIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgY2VudHVyeS4KCjQuIENlbWVudCB3YXMgbm90IHByb2R1Y2VkIHVudGlsIHRoZSBtaWQgMjB0aCBjZW50dXJ5LCBob3dldmVyIGl0IGFsc28gZGlkIG5vdCBleGNlZWRlZCBhIHBhcnRpY2lwYXRpb24gdG8gdGhlIHRvdGFsIHByb2R1Y3Rpb24gb2YgMy40JSBkdXJpbmcgdGhlIHRpbWUgaXQgd2FzIHByb2R1Y2VkIG1ha2luZyBpdCBvbmx5IGEgbWlub3IgcGxheWVyLiBIb3dldmVyIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgaXQgc3RpbGwgaXMgb25lIG9mIHRocmVlIHJlc291cmNlIHR5cGVzIHRoYXQgaW5jcmVhc2VkIGluIHBlcmNlbnRhZ2UgdG90YWwgcHJvZHVjdGlvbi4KCkNvbmNsdWRpbmcgaXQgY2FuIGJlIHNhaWQgdGhhdCB0aGUgcHJvZHVjdGlvbiBkaWQgY2hhbmdlIGluIHRoZSBsYXN0IGNlbnR1cnksIG1haW5seSBhbGwgYW5hbHl6ZWQgY29tbW9kaXRpZXMgaW5jcmVhc2VkIHRoZWlyIHRvdGFsIHByb2R1Y3Rpb24gdm9sdW1lLCBob3dldmVyIHRoZSBwZXJjZW50YWdlIHNob3djYXNlZCBvbmUgbWFqb3Igd2lubmVyIGFuZCBvbmUgbWFqb3IgbG9vc2VyIGR1cmluZyB0aGUgbGFzdCBkZWNhZGUuIEFsbCBvdGhlciBjb21tb2RpdGllcyBkaWQgZ2FpbiBvciBsb3NlIGEgZmV3IHBlcmNlbnRhZ2UgcG9pbnRzLCBidXQgbm8gc3RyaWtpbmcgY2hhbmdlIHdhcyBub3RlZC4KCiMgQ29tcGFyaXNvbiBvZiB0b3RhbCBlbWlzc2lvbiB2ZXJzdXMgdG90YWwgcHJvZHVjdGlvbgpDb21taW5nIHRvIGFuIGVuZCBvZiB0aGUgYW5hbHlzaXMgb2YgdG90YWwgcHJvZHVjdGlvbiB3ZSB3YW50ZWQgdG8gY29tcGFyZSB0aGUgdG90YWwgcHJvZHVjdGlvbiBzdW1tYXJpemVkIHZlcnN1cyB0aGUgdG90YWwgZW1pc3Npb24uIEZpcnN0IG9mIGFsbCwgaXQgaGFzIHRvIGJlIGRlbm90ZWQgdGhhdCB0aGUgc3VtbWFyaXplZCBwcm9kdWN0aW9uIGNvbnNpc3RzIG9mIGEgc3VtbWFyeSBvZiBkaWZmZXJlbnQgdW5pdHMgYW5kIGlzIHRodXMgb25seSBhbiBlc3RpbWF0aW9uLCB3aGlsZSB0aGUgc3VtbWFyaXplZCBlbWlzc2lvbnMgY29uc2lzdCBvZiBvbmUgc2luZ2xlIHVuaXQgYW5kIGFyZSB0aHVzIHByZWNpY2UuCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShkcGx5cikKCnBsb3RfbHkodG90YWxfZW1pc3NfcHJvZCwgeCA9IH55ZWFyLCB5ID0gfnZhbHVlICwgY29sb3IgPSB+Y2F0ZWdvcnksIGNvbG9ycyA9ICJTZXQxIiwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycpICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIlByb2R1Y3Rpb24gdmFsdWUgcGVyIHllYXIgcGVyIHJlc291cmNlIHR5cGUgaW5jbHVkaW5nIHRvdGFsIiwKICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJZZWFyIiksCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRW1pc3Npb24gdmFsdWUiKSwKICAgIGxlZ2VuZCA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAicmVzb3VyY2UgdHlwZSIpKQogICkKYGBgCldoZW4gYW5hbHl6aW5nIHRoZSBkYXRhIGFuIGFsbW9zdCBleHBvbmVudGlhbCBpbmNyZWFzZSBvZiBwcm9kdWN0aW9uIHZhbHVlcyBjYW4gYmUgc2VlbiB3aGlsZSB0aGUgZW1pc3Npb24gdmFsdWVzIGxhZyBiZWhpbmQuIEhvd2V2ZXIsIHRoZXkgc3RpbGwgc2hvdyBhIHNpbWlsYXIgcGF0dGVybiBpbmRpY2F0aW5nIGEgY29ycmVsYXRpb24gYmV0d2VlbiBoaWdoIHByb2R1Y3Rpb24gYW5kIGhpZ2ggZW1pc3Npb24uIFdoZW4gY29tcGFyaW5nIHRoZSB0d28gY3VydmVzIG9uZSBjbGVhciBkaXN0aW5jdGlvbiBjYW4gYmUgb2JzZXJ2ZWQuCgpXaGlsZSB0aGUgcHJvZHVjdGlvbiB2YWx1ZXMgc2hvdyB2ZXJ5IHNoYXJwIGRyb3BzIGFuZCByYXBpZCByZWNvbnNvbGlkYXRpb24sIHRoZSBlbWlzc2lvbiB2YWx1ZXMgc2VlbSB0byBiZSBhIGJpdCBsZXNzIGR5bmFtaWMuIFRoZXkgZG8gbm90IHNwaWtlIGFzIGhpZ2hseSBidXQgZG8gIG5vdCBkcm9wIGFzIHNoYXJwbHkgaW5kaWNhdGluZyBhIGRlY291cGxpbmcgYmV0d2VlbiBwcm9kdWN0aW9uIGFuZCBlbWlzc2lvbi4gVGhlIGFyZ3VtZW50IGJlY29tZXMgbW9yZSBjb21wZWxsaW5nIHdoZW4gZXZhbHVhdGluZyB0aGUgbGFzdCAxMCB5ZWFycy4gV2hpbGUgcHJvZHVjdGlvbiBjb250aW51ZXMgdG8gcmlzZSwgZW1pc3Npb25zIHN0YWduYXRlLCB0aG91Z2ggYSB0cmVuZCByZXZlcnNhbCBjYW4gbm90IGJlIG9ic2VydmVkIGFzIG9mIHlldC4gCgojIEFuYWx5c2lzIG9mIEVtaXNzaW9uIERhdGEKCiMjIFRvdGFsIGVtaXNzaW9ucyBieSBvd25lcnNoaXAgYW5kIHJlc291cmNlIHR5cGUKClRoaXMgYmFyIGNoYXJ0IHByZXNlbnRzIHRoZSB0b3RhbCBlbWlzc2lvbnMgKG1lYXN1cmVkIGluIE10Q08yZSkgY2F0ZWdvcml6ZWQgYnkgdGhyZWUgdHlwZXMgb2Ygb3duZXJzaGlwOiBJbnZlc3Rvci1vd25lZCBDb21wYW5pZXMsIE5hdGlvbiBTdGF0ZXMsIGFuZCBTdGF0ZS1vd25lZCBFbnRpdGllcy4gVGhlIGVtaXNzaW9ucyBkYXRhIGlzIGZ1cnRoZXIgY2F0ZWdvcml6ZWQgYnkgcmVzb3VyY2UgdHlwZSwgd2hpY2ggaW5jbHVkZXMgQ29hbCAoaW5kaWNhdGVkIGluIHJlZCksIEdhcyAoaW5kaWNhdGVkIGluIGdyZWVuKSwgT2lsIChpbmRpY2F0ZWQgaW4gYmx1ZSksIGFuZCBPdGhlciAoaW5kaWNhdGVkIGluIGdyYXkpLiBUaGUgcHJpbWFyeSBmaW5kaW5ncyBhcmUgYXMgZm9sbG93czoKCjEuICDigaBUaGUgZW1pc3Npb25zIGZyb20gaW52ZXN0b3Itb3duZWQgY29tcGFuaWVzIGFyZSBwcmVkb21pbmFudGx5IGRlcml2ZWQgZnJvbSBPaWwgYW5kIEdhcywgd2l0aCBhIGxlc3NlciBjb250cmlidXRpb24gZnJvbSBjb2FsLgoKMi4gIOKBoEZvciBuYXRpb24tb3duZWQgY29tcGFuaWVzLCBjb2FsIGlzIHRoZSBwcmluY2lwYWwgc291cmNlIG9mIGVtaXNzaW9ucywgd2l0aCBPaWwgYW5kIEdhcyBjb250cmlidXRpbmcgdG8gYSBsZXNzZXIgZXh0ZW50LgoKMy4gIOKBoFN0YXRlLW93bmVkIGNvbXBhbmllcyBwcmltYXJpbHkgZ2VuZXJhdGUgZW1pc3Npb25zIGZyb20gT2lsLCB3aXRoIHRvdGFsIGVtaXNzaW9ucyBiZWluZyBjb25zaWRlcmFibHkgaGlnaGVyIHRoYW4gdGhvc2UgZnJvbSBwcml2YXRlbHkgb3duZWQgY29tcGFuaWVzLCB5ZXQgc3RpbGwgbG93ZXIgdGhhbiB0aG9zZSBmcm9tIG5hdGlvbi1vd25lZCBlbnRpdGllcy4KCkEgcG90ZW50aWFsIGV4cGxhbmF0aW9uIGZvciB0aGVzZSB0cmVuZHMgaXMgdGhhdCBpbnZlc3Rvci1vd25lZCBjb21wYW5pZXMgdGVuZCB0byBvcGVyYXRlIG9uIGEgc21hbGxlciBzY2FsZSB3aXRoIGEgZm9jdXMgb24gcHJvZml0YWJpbGl0eS4gSW4gY29udHJhc3QsIG5hdGlvbi1vd25lZCBjb21wYW5pZXMgbWF5IHByaW9yaXRpemUgZW5lcmd5IHNlY3VyaXR5IGFuZCBlbXBoYXNpemUgZW5lcmd5IHByb2R1Y3Rpb24gZnJvbSBkb21lc3RpYyByZXNvdXJjZXMuIEEgc2ltaWxhciByYXRpb25hbGUgbWF5IGFwcGx5IHRvIHN0YXRlLW93bmVkIGNvbXBhbmllcywgd2hpY2ggb2Z0ZW4gb3ZlcnNlZSB0aGUgbmF0aW9uYWwgb2lsIGFuZCBnYXMgc2VjdG9ycyBhbmQgc2VydmUgYXMgYSBjcnVjaWFsIHJldmVudWUgc291cmNlIGZvciBtYW55IGdvdmVybm1lbnRzLgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShwbG90bHkpCiNvcGVuIHRoZSBkYXRhCmRhdGEgPC0gZW1pc3Npb25zCiNmaWx0ZXJpbmcgdGhlIGxhc3QgNTAgeWVhcnMKbGF0ZXN0NTBfeWVhcnMgPSBtYXgoZGF0YSR5ZWFyKQpkYXRhIDwtZGF0YSAlPiUKICBmaWx0ZXIoIHllYXIgPj0gKGxhdGVzdDUwX3llYXJzLSA1MCkpCiMgY2F0ZWdvcml6ZWQgY29tbW9kaXRpZXMKZGF0YSRyZXNvdXJjZV90eXBlIDwtIGlmZWxzZSgKICBkYXRhJGNvbW1vZGl0eSA9PSAiT2lsICYgTkdMIiwgIk9pbCIsCiAgaWZlbHNlKAogICAgZGF0YSRjb21tb2RpdHkgPT0gIk5hdHVyYWwgR2FzIiwgIkdhcyIsCiAgICBpZmVsc2UoCiAgICAgIGRhdGEkY29tbW9kaXR5ICVpbiUgYygiTWV0YWxsdXJnaWNhbCBDb2FsIiwgIkFudGhyYWNpdGUgQ29hbCIgLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCaXR1bWlub3VzIENvYWwiLCJTdWItQml0dW1pbm91cyBDb2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVybWFsIENvYWwiICwiTGlnbml0ZSBDb2FsIiApLCAiQ29hbCIsCiAgICAgICJPdGhlciIKICAgICkKICApCikKI3N1bW1lcnkgZm9yIG93bmVyc2hpcCBhbmQgY29tbW9kaXR5IGludG8gZW1taXNpb25zCnN1bW1hcnlfZGF0YSA8LSBkYXRhICU+JQogIGdyb3VwX2J5KHBhcmVudF90eXBlLHJlc291cmNlX3R5cGUpICU+JQogIHN1bW1hcmlzZShlbWlzc2lvbnNfTXRDTzJlID0gc3VtKHRvdGFsX2VtaXNzaW9uc19NdENPMmUsIG5hLnJtID0gVFJVRSkpJT4lCiAgdW5ncm91cCgpCiMgQ29sb3JzCmVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiQ29hbCIgPSAiI0UzMTIwQiIsICAjIEJvbGQgcmVkCiAgIk9pbCIgPSAiIzAwNTZBMyIsICAgIyBCb2xkIGJsdWUKICAiR2FzIiA9ICIjMDA4RjQ3IiwgICAjIEJvbGQgZ3JlZW4KICAiT3RoZXIiID0gIiNBNUE1QTUiICAjIE5ldXRyYWwgZ3JheQopCgojIEJBUiBDSEFSVApzdGF0aWNfcGxvdCA8LSBnZ3Bsb3Qoc3VtbWFyeV9kYXRhLCBhZXMoCiAgeCA9IHBhcmVudF90eXBlLCAKICB5ID0gZW1pc3Npb25zX010Q08yZSwgCiAgZmlsbCA9IHJlc291cmNlX3R5cGUsIAogIHRleHQgPSBwYXN0ZTAoCiAgICAiT3duZXJzaGlwOiAiLCBwYXJlbnRfdHlwZSwgCiAgICAiPGJyPlJlc291cmNlOiAiLCByZXNvdXJjZV90eXBlLCAKICAgICI8YnI+RW1pc3Npb246ICIsIHJvdW5kKGVtaXNzaW9uc19NdENPMmUsIDIpLCAiIE10Q08yZSIKICApCikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAic3RhY2siLCB3aWR0aCA9IDAuNykgKyAgIyBBZGp1c3QgYmFyIHdpZHRoCiAgbGFicygKICAgIHRpdGxlID0gIlRvdGFsIEVtaXNzaW9ucyBieSBPd25lcnNoaXAgYW5kIFJlc291cmNlIFR5cGUiLAogICAgc3VidGl0bGUgPSAiU3RhY2tlZCBlbWlzc2lvbnMgYWNyb3NzIGRpZmZlcmVudCBvd25lcnNoaXAgY2F0ZWdvcmllcyIsCiAgICB4ID0gIk93bmVyc2hpcCIsCiAgICB5ID0gIlRvdGFsIEVtaXNzaW9ucyBpbiBNdENPMiIsCiAgICBmaWxsID0gIlJlc291cmNlIFR5cGUiCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZWNvbm9taXN0X2NvbG9ycykgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE2LCBjb2xvciA9ICJibGFjayIpLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGNvbG9yID0gImJsYWNrIiksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvciA9ICJibGFjayIpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGNvbG9yID0gImJsYWNrIiksCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpLCAgICAKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSksICAgICAKICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSwgIAogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCkKICApCgojIENvbnZlcnQgdG8gaW50ZXJhY3RpdmUgcGxvdCAKaW50ZXJhY3RpdmVfcGxvdCA8LSBnZ3Bsb3RseShzdGF0aWNfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKCmludGVyYWN0aXZlX3Bsb3QKYGBgCgojIyBZZWFybHkgZW1pc3Npb25zIGJ5IHJlc291cmNlIHR5cGUgdHlwZQoKQSBuZXcgY2hhcnQgcHJlc2VudHMgYW4gYW5hbHlzaXMgb2YgYW5udWFsIGVtaXNzaW9ucyBjYXRlZ29yaXplZCBieSBjb21tb2RpdHkgdHlwZSBmcm9tIDE5MDAgdG8gMjAyNSwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIENvYWwsIEdhcywgT2lsLCBhbmQgT3RoZXIgcmVzb3VyY2VzLiBUaGlzIGdyYXBoIGVmZmVjdGl2ZWx5IGludGVncmF0ZXMgZGF0YSBmcm9tIFN0YXRlLW93bmVkIEVudGl0aWVzIGFuZCBOYXRpb24gU3RhdGVzLiBUaGUgcHJpbmNpcGFsIGZpbmRpbmdzIGFyZSBhcyBmb2xsb3dzOgoKMS4gIOKBoENvYWwgY29udGludWVzIHRvIGJlIHRoZSBwcmVkb21pbmFudCBzb3VyY2Ugb2YgZW1pc3Npb25zLCBmb2xsb3dlZCBieSBPaWwsIHdpdGggR2FzIGNvbnRyaWJ1dGluZyBsZXNzIHNpZ25pZmljYW50bHkgYW5kIE90aGVyIHJlc291cmNlcyBoYXZpbmcgbWluaW1hbCBpbXBhY3QuCgoyLiDigaAg4oGgQSBub3RhYmxlIHN1cmdlIGluIGVtaXNzaW9ucyBhY3Jvc3MgYWxsIHJlc291cmNlIGNhdGVnb3JpZXMgaXMgb2JzZXJ2ZWQgYmVnaW5uaW5nIGluIHRoZSBtaWQtMjB0aCBjZW50dXJ5LgoKMy4g4oGgIOKBoFdoaWxlIGNvYWwgZW1pc3Npb25zIGFyZSBzdWJzdGFudGlhbCwgdGhlcmUgaXMgYSBtYXJrZWQgaW5jcmVhc2UgaW4gb2lsIGVtaXNzaW9ucyBwb3N0LW1pZC0yMHRoIGNlbnR1cnksIGFuZCBnYXMgZW1pc3Npb25zIGV4aGliaXQgYSBtb3JlIGdyYWR1YWwgcmlzZS4KCgpTZXZlcmFsIGZhY3RvcnMgbWF5IGV4cGxhaW4gdGhlc2UgdHJlbmRzLiBDb2FsIHNlcnZlZCBhcyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgaW5kdXN0cmlhbCByZXZvbHV0aW9uIGFuZCBtYWludGFpbmVkIGl0cyBzdGF0dXMgYXMgdGhlIHByaW1hcnkgZW5lcmd5IHNvdXJjZSBmb3IgbWFueSB5ZWFycyBkdWUgdG8gaXRzIGF2YWlsYWJpbGl0eSBhbmQgYWZmb3JkYWJpbGl0eS4gSXQgYmVjYW1lIHRoZSBsZWFkaW5nIGZ1ZWwgZm9yIHBvd2VyIGdlbmVyYXRpb24gd29ybGR3aWRlLCB3aXRoIGl0cyB1c2FnZSBwZWFraW5nIGluIHRoZSBsYXRlIDIwdGggY2VudHVyeSB0byBtYXRjaCB3aXRoIHJpc2luZyBlbGVjdHJpY2l0eSBkZW1hbmRzLiAKClRoZSBwZWFrIHBlcmlvZCBmb3Igb2lsIGVtaXNzaW9ucyBvY2N1cnJlZCBmcm9tIHRoZSBsYXRlIDIwdGggY2VudHVyeSB0byB0aGUgZWFybHkgMjFzdCBjZW50dXJ5LCBjb2luY2lkaW5nIHdpdGggdGhlIGdsb2JhbCBleHBhbnNpb24gb2YgdHJhbnNwb3J0YXRpb24gbW9kZXMgc3VjaCBhcyBhdXRvbW9iaWxlcywgYWlyY3JhZnQsIGFuZCBzaGlwcGluZyBmb2xsb3dpbmcgV29ybGQgV2FyIElJLiBBZGRpdGlvbmFsbHksIG9pbCBlbWVyZ2VkIGFzIGEgY3J1Y2lhbCBjb21wb25lbnQgaW4gdGhlIHByb2R1Y3Rpb24gb2YgcGxhc3RpY3MsIGNoZW1pY2FscywgYW5kIHN5bnRoZXRpYyBtYXRlcmlhbHMsIGZ1cnRoZXIgZXNjYWxhdGluZyBkZW1hbmQuIFRoZSAxOTcwcyBleHBlcmllbmNlZCBzaWduaWZpY2FudCBpbmNyZWFzZXMgaW4gb2lsIHByb2R1Y3Rpb24gYW5kIGVtaXNzaW9ucywgZGVzcGl0ZSBmbHVjdHVhdGlvbnMgaW4gcHJpY2VzLCBsYXJnZWx5IGR1ZSB0byB0aGUgY29udHJvbCBleGVydGVkIGJ5IHN0YXRlLW93bmVkIGVudGl0aWVzIGluIE9QRUMgbmF0aW9ucyBvdmVyIGEgc3Vic3RhbnRpYWwgcG9ydGlvbiBvZiB0aGUgZ2xvYmFsIHN1cHBseS4KCk5hdHVyYWwgZ2FzIGhhcyBnYWluZWQgdHJhY3Rpb24gYXMgYSAiY2xlYW5lciIgZm9zc2lsIGZ1ZWwgYWx0ZXJuYXRpdmUgdG8gY29hbCwgcmVzdWx0aW5nIGluIGEgc3RlYWR5IHJpc2UgaW4gZW1pc3Npb25zIGFzIG5hdGlvbnMgc2hpZnRlZCBhd2F5IGZyb20gY29hbCBkZXBlbmRlbmN5LiBOdW1lcm91cyBOYXRpb24gU3RhdGVzIGFuZCBTdGF0ZS1vd25lZCBFbnRpdGllcyBoYXZlIG1hZGUgY29uc2lkZXJhYmxlIGludmVzdG1lbnRzIGluIGdhcyBwcm9kdWN0aW9uLCByZWNvZ25pc2luZyBpdCBhcyBhIHN0cmF0ZWdpYyBlbmVyZ3kgcmVzb3VyY2UsIHBhcnRpY3VsYXJseSBpbiB0aGUgMjFzdCBjZW50dXJ5LiBUaGlzIHVwd2FyZCB0cmVuZCBpbiBnYXMgZW1pc3Npb25zIGlzIG9uZ29pbmcsIHJlZmxlY3RpbmcgY29uc2lzdGVudCBncm93dGggc2luY2UgdGhlIGxhdGUgMjB0aCBjZW50dXJ5LgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocGxvdGx5KQojb3BlbiB0aGUgZGF0YQojZmlsZV9wYXRoIDwtICJ+L0Rlc2t0b3AvUnByb2plY3QvRW1pc3Npb25zX20uY3N2IiAgCmRhdGFfYXJlYSA8LSBlbWlzc2lvbnMKIyBjYXRlZ29yaXplZCBjb21tb2RpdGllcwpkYXRhX2FyZWEkcmVzb3VyY2VfdHlwZSA8LSBpZmVsc2UoCiAgZGF0YV9hcmVhJGNvbW1vZGl0eSA9PSAiT2lsICYgTkdMIiwgIk9pbCIsCiAgaWZlbHNlKAogICAgZGF0YV9hcmVhJGNvbW1vZGl0eSA9PSAiTmF0dXJhbCBHYXMiLCAiR2FzIiwKICAgIGlmZWxzZSgKICAgICAgZGF0YV9hcmVhJGNvbW1vZGl0eSAlaW4lIGMoIk1ldGFsbHVyZ2ljYWwgQ29hbCIsICJBbnRocmFjaXRlIENvYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJpdHVtaW5vdXMgQ29hbCIsICJTdWItQml0dW1pbm91cyBDb2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJtYWwgQ29hbCIsICJMaWduaXRlIENvYWwiKSwgIkNvYWwiLAogICAgICAiT3RoZXIiCiAgICApCiAgKQopCgojY29udmVydCBhbmQgcmV2ZXJzZSBvcmRlciBmb3Igc3RhY2tpbmcKZGF0YV9hcmVhJHJlc291cmNlX3R5cGUgPC0gZmFjdG9yKGRhdGFfYXJlYSRyZXNvdXJjZV90eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk90aGVyIiwgIkdhcyIsICJPaWwiLCAiQ29hbCIpKSAgCiMgY29tYmluZSBOYXRpb24gYW5kIHN0YXRlLW93bmVkCmZpbHRlcmVkX2RhdGFfYXJlYSA8LSBkYXRhX2FyZWEgJT4lCiAgZmlsdGVyKHBhcmVudF90eXBlICVpbiUgYygiTmF0aW9uIFN0YXRlIiwgIlN0YXRlLW93bmVkIEVudGl0eSIpKQoKIyBzdW0gb2YgRW1pcyBieSB5ZWFyK3R5cGUKc3VtbWFyeV9kYXRhX2FyZWEgPC0gZmlsdGVyZWRfZGF0YV9hcmVhICU+JQogIGZpbHRlcighaXMubmEodG90YWxfZW1pc3Npb25zX010Q08yZSkpICU+JQogIGdyb3VwX2J5KHllYXIsIHJlc291cmNlX3R5cGUpICU+JQogIHN1bW1hcmlzZShlbWlzc2lvbnNfTXRDTzJlID0gc3VtKHRvdGFsX2VtaXNzaW9uc19NdENPMmUsIG5hLnJtID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKQoKIyBOZWVkIHRvIHN0YWNrIGl0CnN1bW1hcnlfZGF0YV9hcmVhIDwtIHN1bW1hcnlfZGF0YV9hcmVhICU+JQogIGFycmFuZ2UoeWVhciwgcmVzb3VyY2VfdHlwZSkgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgbXV0YXRlKAogICAgeW1pbiA9IGN1bXN1bShlbWlzc2lvbnNfTXRDTzJlKSAtIGVtaXNzaW9uc19NdENPMmUsI2xvd2UgIAogICAgeW1heCA9IGN1bXN1bShlbWlzc2lvbnNfTXRDTzJlKSAjdXBwZXIgICAgICAgICAgICAgICAgICAgICAKICApICU+JQogIHVuZ3JvdXAoKQoKIyBFY29ub21pc3Qtc3R5bGUgY29sb3JzCmVjb25vbWlzdF9jb2xvcnMgPC0gYygKICAiQ29hbCIgPSAiI0UzMTIwQiIsICAjIFJlZAogICJPaWwiID0gIiMwMDU2QTMiLCAgICMgQmx1ZQogICJHYXMiID0gIiMwMDhGNDciLCAgICMgR3JlZW4KICAiT3RoZXIiID0gIiNBNUE1QTUiICAjIEdyZXkKKQoKIyBQTE9UCnN0YXRpY19wbG90IDwtIGdncGxvdChzdW1tYXJ5X2RhdGFfYXJlYSwgYWVzKHggPSB5ZWFyLCBncm91cCA9IHJlc291cmNlX3R5cGUpKSArCiAgIyAxIGxheWVyIGZhZGVkIHN0YWNrZWQgYXJlYSBjaGFydAogIGdlb21fcmliYm9uKGFlcygKICAgIHltaW4gPSB5bWluLAogICAgeW1heCA9IHltYXgsCiAgICBmaWxsID0gcmVzb3VyY2VfdHlwZSwKICAgIHRleHQgPSBwYXN0ZTAoCiAgICAgICJZZWFyOiAiLCB5ZWFyLCAKICAgICAgIjxicj5SZXNvdXJjZTogIiwgcmVzb3VyY2VfdHlwZSwgCiAgICAgICI8YnI+RW1pc3Npb246ICIsIHJvdW5kKGVtaXNzaW9uc19NdENPMmUsIDIpCiAgICApCiAgKSwgYWxwaGEgPSAwLjUpICsKICAjIDJuZCBsYXllciBhZGRpbmcgTGluZXMgCiAgZ2VvbV9saW5lKGFlcygKICAgIHkgPSB5bWF4LAogICAgY29sb3IgPSByZXNvdXJjZV90eXBlLAogICAgdGV4dCA9IHBhc3RlMCgKICAgICAgIlllYXI6ICIsIHllYXIsIAogICAgICAiPGJyPlJlc291cmNlOiAiLCByZXNvdXJjZV90eXBlLCAKICAgICAgIjxicj5FbWlzc2lvbjogIiwgcm91bmQoZW1pc3Npb25zX010Q08yZSwgMikKICAgICkKICApLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAgIyBTdXBwcmVzcyBsZWdlbmQgZm9yIGxpbmVzCiAgIyAzcmQgbGF5ZXIgYWRkaW5nIGxhYmVsIHRvIGEgbGluZQogIGxhYnMoCiAgICB0aXRsZSA9ICJZZWFybHkgRW1pc3Npb25zIGZvciBOYXRpb24gYW5kIFN0YXRlIG93bmVkIiwKICAgIHggPSAiWWVhciIsCiAgICB5ID0gIlRvdGFsIEVtaXNzaW9ucyBpbiBNdENPMiIsCiAgICBmaWxsID0gIlJlc291cmNlIFR5cGUiLAogICAgY29sb3IgPSAiUmVzb3VyY2UgVHlwZSIKICApICsKICAjIGNvbG9yaW5nCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZWNvbm9taXN0X2NvbG9ycykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBlY29ub21pc3RfY29sb3JzKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgTkEpLCBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4wNSkpKSArCiAgI2dlbmVyYWwgbG9vawogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpLAogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIsIGxpbmV0eXBlID0gImRvdHRlZCIpLAogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIikKICApCgojIGNvbnZlcnQgdG8gYW4gaW50ZXJhY3RpdmUgcGxvdAppbnRlcmFjdGl2ZV9wbG90IDwtIGdncGxvdGx5KHN0YXRpY19wbG90LCB0b29sdGlwID0gInRleHQiKSAlPiUKICBsYXlvdXQoCiAgICBsZWdlbmQgPSBsaXN0KAogICAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJSZXNvdXJjZSBUeXBlIiksIAogICAgICBvcmllbnRhdGlvbiA9ICJ2IgogICAgKSwKICAgIHNob3dsZWdlbmQgPSBUUlVFCiAgKQoKIyBSZW5hbWUgbGVnZW5kIGl0ZW1zIHRvIGNsZWFuIGxhYmVscwppbnRlcmFjdGl2ZV9wbG90JHgkZGF0YSA8LSBsYXBwbHkoaW50ZXJhY3RpdmVfcGxvdCR4JGRhdGEsIGZ1bmN0aW9uKHRyYWNlKSB7CiAgaWYgKCFpcy5udWxsKHRyYWNlJGxlZ2VuZGdyb3VwKSkgewogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCIsMSIsICIiLCB0cmFjZSRuYW1lKSAgIyBSZW1vdmUgIiwxIgogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCJcXCgiLCAiIiwgdHJhY2UkbmFtZSkgICMgUmVtb3ZlICIoIgogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCJcXCkiLCAiIiwgdHJhY2UkbmFtZSkgICMgUmVtb3ZlICIpIgogIH0KICB0cmFjZQp9KQoKCmludGVyYWN0aXZlX3Bsb3QKYGBgCgojIyBZZWFybHkgZW1pc3Npb25zIGJ5IHJlc291cmNlIHR5cGUKClRoZSB0cmVuZHMgb2JzZXJ2ZWQgaW4gaW52ZXN0b3Itb3duZWQgY29tcGFuaWVzIGV4aGliaXQgc2ltaWxhcml0aWVzIHRvIHRob3NlIG9mIHN0YXRlIG9yIG5hdGlvbi1vd25lZCBlbnRpdGllcywgeWV0IG5vdGFibGUgZGlzdGluY3Rpb25zIGV4aXN0LiBUb3RhbCBlbWlzc2lvbnMgZnJvbSBpbnZlc3Rvci1vd25lZCBmaXJtcyBhcmUgY29tcGFyYXRpdmVseSBsb3dlciB0aGFuIHRob3NlIGZyb20gdGhlaXIgc3RhdGUvbmF0aW9uLW93bmVkIGNvdW50ZXJwYXJ0cy4gVGhlIGVtaXNzaW9ucyBwcm9maWxlIG9mIHRoZXNlIGNvbXBhbmllcyBpcyBwcmltYXJpbHkgaW5mbHVlbmNlZCBieSBvaWwgYW5kIGdhcywgd2l0aCBjb2FsIGNvbnRyaWJ1dGluZyBtaW5pbWFsbHkuIFRoaXMgc3VnZ2VzdHMgYSBwcm9ub3VuY2VkIGVtcGhhc2lzIG9uIG1hcmtldC1kcml2ZW4gcmVzb3VyY2VzLCBzdWNoIGFzIG9pbCBhbmQgZ2FzLCB3aGljaCB0ZW5kIHRvIHlpZWxkIGhpZ2hlciBwcm9maXRzIHdpdGhpbiB0aGUgcHJpdmF0ZSBzZWN0b3IuCgpJbiBpbnZlc3Rvci1vd25lZCBmaXJtcywgb2lsIGVtaXNzaW9ucyBhcmUgcGFydGljdWxhcmx5IHByb21pbmVudCwgcGVha2luZyBpbiBjb25qdW5jdGlvbiB3aXRoIGdsb2JhbCBpbmR1c3RyaWFsIGFuZCB0cmFuc3BvcnRhdGlvbiBleHBhbnNpb25zLiBUaGUgcHJpdmF0ZSBzZWN0b3IncyB0ZW5kZW5jeSB0b3dhcmRzIG9pbCBpcyBhIHNpZ24gb2YgaXRzIHByb2ZpdGFiaWxpdHkgYW5kIHJvYnVzdCBkZW1hbmQgaW4gaW50ZXJuYXRpb25hbCBtYXJrZXRzLiBBbHRob3VnaCBnYXMgYWxzbyBwbGF5cyBhIHNpZ25pZmljYW50IHJvbGUsIGl0IHJlbWFpbnMgc2Vjb25kYXJ5IHRvIG9pbC4gSXRzIGltcG9ydGFuY2UgaGFzIGdyb3duIGluIHJlY2VudCBkZWNhZGVzIGFzIHByaXZhdGUgZW50ZXJwcmlzZXMgbGV2ZXJhZ2UgaXRzIHJpc2luZyBkZW1hbmQgYXMgYSAidHJhbnNpdGlvbiBmdWVsLiIgQ29udmVyc2VseSwgY29hbCdzIGNvbnRyaWJ1dGlvbiBpcyBjb25zaWRlcmFibHkgZGltaW5pc2hlZCwgcmVmbGVjdGluZyB0aGUgcHJpdmF0ZSBzZWN0b3IncyBncmFkdWFsIHNoaWZ0IGF3YXkgZnJvbSBjb2FsIGluIHJlc3BvbnNlIHRvIHJlZ3VsYXRvcnkgY2hhbGxlbmdlcyBhbmQgZGVjcmVhc2luZyBwcm9maXRhYmlsaXR5LgoKSW4gY29udHJhc3QsIHN0YXRlIG9yIG5hdGlvbi1vd25lZCBlbnRpdGllcyBleGhpYml0IHNpZ25pZmljYW50bHkgaGlnaGVyIHRvdGFsIGVtaXNzaW9ucywgd2l0aCBjb2FsIGJlaW5nIHRoZSBwcmVkb21pbmFudCBzb3VyY2UsIHdoaWxlIG9pbCBhbmQgZ2FzIGFsc28gY29udHJpYnV0ZSBzdWJzdGFudGlhbGx5LiBUaGVzZSBlbnRpdGllcyBkZW1vbnN0cmF0ZSBhIHNsb3dlciBwYWNlIGluIG1vdmluZyBhd2F5IGZyb20gZm9zc2lsIGZ1ZWxzLCBwYXJ0aWN1bGFybHkgY29hbCwgd2hpY2ggbWF5IGJlIGF0dHJpYnV0ZWQgdG8gcG9saXRpY2FsIGluZXJ0aWEsIGV4aXN0aW5nIGluZnJhc3RydWN0dXJlLCBhbmQgZWNvbm9taWMgZGVwZW5kZW5jZSBvbiBzdGF0ZS1tYW5hZ2VkIHJlc291cmNlcy4gV2hpbGUgaW52ZXN0b3Itb3duZWQgY29tcGFuaWVzIHJlbWFpbiBoZWF2aWx5IHJlbGlhbnQgb24gb2lsIGFuZCBnYXMsIHRoZXkgYXBwZWFyIHRvIGJlIG1vcmUgYWdpbGUgaW4gYWRhcHRpbmcgdG8gbWFya2V0IGR5bmFtaWNzIGFuZCByZWd1bGF0b3J5IGluZmx1ZW5jZXMsIHBvdGVudGlhbGx5IGZhY2lsaXRhdGluZyBhIG1vcmUgcmFwaWQgdHJhbnNpdGlvbiB0b3dhcmRzIGNsZWFuZXIgZW5lcmd5IGFsdGVybmF0aXZlcy4KYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCiNvcGVuIHRoZSBkYXRhCiNmaWxlX3BhdGggPC0gIn4vRGVza3RvcC9ScHJvamVjdC9FbWlzc2lvbnNfbS5jc3YiICAKZGF0YV9hcmVhMSA8LSBlbWlzc2lvbnMKIyBDYXRlZ29yaXplIHRoZSBjb21tb2RpdGllcwpkYXRhX2FyZWExJHJlc291cmNlX3R5cGUxIDwtIGlmZWxzZSgKICBkYXRhX2FyZWExJGNvbW1vZGl0eSA9PSAiT2lsICYgTkdMIiwgIk9pbCIsCiAgaWZlbHNlKAogICAgZGF0YV9hcmVhMSRjb21tb2RpdHkgPT0gIk5hdHVyYWwgR2FzIiwgIkdhcyIsCiAgICBpZmVsc2UoCiAgICAgIGRhdGFfYXJlYTEkY29tbW9kaXR5ICVpbiUgYygiTWV0YWxsdXJnaWNhbCBDb2FsIiwgIkFudGhyYWNpdGUgQ29hbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQml0dW1pbm91cyBDb2FsIiwgIlN1Yi1CaXR1bWlub3VzIENvYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcm1hbCBDb2FsIiwgIkxpZ25pdGUgQ29hbCIpLCAiQ29hbCIsCiAgICAgICJPdGhlciIKICAgICkKICApCikKCiMgQ29udmVydCDigaDigK9yZXNvdXJjZV90eXBlMeKAr+KBoCB0byBhIGZhY3RvciB3aXRoIHRoZSBkZXNpcmVkIHN0YWNraW5nIG9yZGVyCmRhdGFfYXJlYTEkcmVzb3VyY2VfdHlwZTEgPC0gZmFjdG9yKGRhdGFfYXJlYTEkcmVzb3VyY2VfdHlwZTEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJPdGhlciIsICJHYXMiLCAiQ29hbCIsICJPaWwiKSkKCiMgRmlsdGVyIGZvciBJbnZlc3Rvci1vd25lZCBjb21wYW5pZXMgb25seQpmaWx0ZXJlZF9kYXRhX2FyZWExIDwtIGRhdGFfYXJlYTEgJT4lCiAgZmlsdGVyKHBhcmVudF90eXBlID09ICJJbnZlc3Rvci1vd25lZCBDb21wYW55IikKCiMgU3VtbWFyaXplIGVtaXNzaW9ucyBieSB5ZWFyIGFuZCByZXNvdXJjZSB0eXBlCnN1bW1hcnlfZGF0YV9hcmVhMSA8LSBmaWx0ZXJlZF9kYXRhX2FyZWExICU+JQogIGZpbHRlcighaXMubmEodG90YWxfZW1pc3Npb25zX010Q08yZSkpICU+JQogIGdyb3VwX2J5KHllYXIsIHJlc291cmNlX3R5cGUxKSAlPiUKICBzdW1tYXJpc2UoZW1pc3Npb25zX010Q08yZTEgPSBzdW0odG90YWxfZW1pc3Npb25zX010Q08yZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpCgojIENhbGN1bGF0ZSBzdGFja2luZyAoY3VtdWxhdGl2ZSBlbWlzc2lvbnMpCnN1bW1hcnlfZGF0YV9hcmVhMSA8LSBzdW1tYXJ5X2RhdGFfYXJlYTEgJT4lCiAgYXJyYW5nZSh5ZWFyLCByZXNvdXJjZV90eXBlMSkgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgbXV0YXRlKAogICAgeW1pbiA9IGN1bXN1bShlbWlzc2lvbnNfTXRDTzJlMSkgLSBlbWlzc2lvbnNfTXRDTzJlMSwgICMgTG93ZXIgYm91bmQgb2YgdGhlIHJpYmJvbgogICAgeW1heCA9IGN1bXN1bShlbWlzc2lvbnNfTXRDTzJlMSkgICAgICAgICAgICAgICAgICAgICAgIyBVcHBlciBib3VuZCBvZiB0aGUgcmliYm9uCiAgKSAlPiUKICB1bmdyb3VwKCkKCiMgRWNvbm9taXN0LXN0eWxlIGNvbG9ycwplY29ub21pc3RfY29sb3JzIDwtIGMoCiAgIk9pbCIgPSAiIzAwNTZBMyIsICAgIyBCbHVlCiAgIkNvYWwiID0gIiNFMzEyMEIiLCAgIyBSZWQKICAiR2FzIiA9ICIjMDA4RjQ3IiwgICAjIEdyZWVuCiAgIk90aGVyIiA9ICIjQTVBNUE1IiAgIyBHcmV5CikKCiMgUGxvdApzdGF0aWNfcGxvdDEgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YV9hcmVhMSwgYWVzKHggPSB5ZWFyLCBncm91cCA9IHJlc291cmNlX3R5cGUxKSkgKwogICMgMS4gRmFkZWQgc3RhY2tlZCBhcmVhIGNoYXJ0CiAgZ2VvbV9yaWJib24oYWVzKAogICAgeW1pbiA9IHltaW4sCiAgICB5bWF4ID0geW1heCwKICAgIGZpbGwgPSByZXNvdXJjZV90eXBlMSwKICAgIHRleHQgPSBwYXN0ZTAoCiAgICAgICJZZWFyOiAiLCB5ZWFyLCAKICAgICAgIjxicj5SZXNvdXJjZTogIiwgcmVzb3VyY2VfdHlwZTEsIAogICAgICAiPGJyPkVtaXNzaW9uOiAiLCByb3VuZChlbWlzc2lvbnNfTXRDTzJlMSwgMikKICAgICkKICApLCBhbHBoYSA9IDAuNSkgKwogICMgMi4gTGluZSBjaGFydCBmb3IgdGhlIHRvcCBvZiBlYWNoIHJpYmJvbgogIGdlb21fbGluZShhZXMoCiAgICB5ID0geW1heCwKICAgIGNvbG9yID0gcmVzb3VyY2VfdHlwZTEsCiAgICB0ZXh0ID0gcGFzdGUwKAogICAgICAiWWVhcjogIiwgeWVhciwgCiAgICAgICI8YnI+UmVzb3VyY2U6ICIsIHJlc291cmNlX3R5cGUxLCAKICAgICAgIjxicj5FbWlzc2lvbjogIiwgcm91bmQoZW1pc3Npb25zX010Q08yZTEsIDIpCiAgICApCiAgKSwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRkFMU0UpICsgICMgU3VwcHJlc3MgbGVnZW5kIGZvciBsaW5lcwogICMgMy4gTGFiZWxzCiAgbGFicygKICAgIHRpdGxlID0gIlllYXJseSBFbWlzc2lvbnMgZm9yIEludmVzdG9yLW93bmVkIENvbXBhbmllcyIsCiAgICB4ID0gIlllYXIiLAogICAgeSA9ICJUb3RhbCBFbWlzc2lvbnMgaW4gTXRDTzIiLAogICAgZmlsbCA9ICJSZXNvdXJjZSBUeXBlIiwKICAgIGNvbG9yID0gIlJlc291cmNlIFR5cGUiCiAgKSArCiAgIyBDb2xvcnMgZm9yIGJvdGggYXJlYXMgYW5kIGxpbmVzCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZWNvbm9taXN0X2NvbG9ycykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBlY29ub21pc3RfY29sb3JzKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgTkEpLCBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4wNSkpKSArCiAgIyBTdHlsaW5nCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSksCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTgwIiwgbGluZXR5cGUgPSAiZG90dGVkIiksCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKQogICkKCiMgQ29udmVydCB0byBpbnRlcmFjdGl2ZSBwbG90CmludGVyYWN0aXZlX3Bsb3QxIDwtIGdncGxvdGx5KHN0YXRpY19wbG90MSwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lCiAgbGF5b3V0KAogICAgbGVnZW5kID0gbGlzdCgKICAgICAgdGl0bGUgPSBsaXN0KHRleHQgPSAiUmVzb3VyY2UgVHlwZSIpLCAKICAgICAgb3JpZW50YXRpb24gPSAidiIKICAgICksCiAgICBzaG93bGVnZW5kID0gVFJVRQogICkKCiMgUmVuYW1lIGxlZ2VuZCBpdGVtcyB0byBjbGVhbiBsYWJlbHMKaW50ZXJhY3RpdmVfcGxvdDEkeCRkYXRhIDwtIGxhcHBseShpbnRlcmFjdGl2ZV9wbG90MSR4JGRhdGEsIGZ1bmN0aW9uKHRyYWNlKSB7CiAgaWYgKCFpcy5udWxsKHRyYWNlJGxlZ2VuZGdyb3VwKSkgewogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCIsMSIsICIiLCB0cmFjZSRuYW1lKSAgIyBSZW1vdmUgIiwxIgogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCJcXCgiLCAiIiwgdHJhY2UkbmFtZSkgICMgUmVtb3ZlICIoIgogICAgdHJhY2UkbmFtZSA8LSBnc3ViKCJcXCkiLCAiIiwgdHJhY2UkbmFtZSkgICMgUmVtb3ZlICIpIgogIH0KICB0cmFjZQp9KQoKIyBEaXNwbGF5IGludGVyYWN0aXZlIHBsb3QKaW50ZXJhY3RpdmVfcGxvdDEKYGBgCiMgQ29uY2x1c2lvbgoKVGhlIGV4YW1pbmF0aW9uIG9mIHByb2R1Y3Rpb24gdmFsdWVzIGFuZCBlbWlzc2lvbnMgdHJlbmRzIGFjcm9zcyBkaWZmZXJlbnQgY29tbW9kaXRpZXMgcmV2ZWFscyBzaWduaWZpY2FudCBwYXR0ZXJucyBpbiByZXNvdXJjZSB1c2UsIGluZHVzdHJpYWwgZGV2ZWxvcG1lbnQsIGFuZCBlbnZpcm9ubWVudGFsIHJlcGVyY3Vzc2lvbnMgb3ZlciB0aW1lLgoKQ29hbCwgZXNwZWNpYWxseSBCaXR1bWlub3VzIGFuZCBUaGVybWFsIENvYWwsIHdhcyBlc3NlbnRpYWwgZHVyaW5nIHRoZSBpbml0aWFsIHN0YWdlcyBvZiBpbmR1c3RyaWFsaXNhdGlvbi4gQWx0aG91Z2ggaXRzIHByb3BvcnRpb24gaW4gdG90YWwgZW5lcmd5IHByb2R1Y3Rpb24gaGFzIGRpbWluaXNoZWQsIGl0IGNvbnRpbnVlcyB0byBob2xkIGltcG9ydGFuY2UsIHBhcnRpY3VsYXJseSBpbiBkZXZlbG9waW5nIG5hdGlvbnMgYW5kIHN0YXRlLWRyaXZlbiBlbmVyZ3kgZnJhbWV3b3Jrcy4gU2luY2UgdGhlIG1pZC0yMHRoIGNlbnR1cnksIG9pbCBhbmQgbmF0dXJhbCBnYXMgbGlxdWlkcyBoYXZlIGNvbnNpc3RlbnRseSBsZWQgaW4gYm90aCBwcm9kdWN0aW9uIGFuZCBlbWlzc2lvbnMsIGxhcmdlbHkgZHVlIHRvIHRoZWlyIGtleSByb2xlIGluIHRyYW5zcG9ydGF0aW9uLCBlbmVyZ3kgZ2VuZXJhdGlvbiwgYW5kIGluZHVzdHJpYWwgcHJvY2Vzc2VzLiBOYXR1cmFsIGdhcyBoYXMgZW1lcmdlZCBhcyBhIHByb21pbmVudCBhbHRlcm5hdGl2ZSB0byBjb2FsLCBwcm92aWRpbmcgY2xlYW5lciBlbmVyZ3kgd2l0aCByZWR1Y2VkIGVtaXNzaW9ucyB3aGlsZSBtYWludGFpbmluZyBpbmNyZWFzaW5nIHByb2R1Y3Rpb24uIENvbnNlcXVlbnRseSwgdGhlIHBlcmlvZCBmb2xsb3dpbmcgV29ybGQgV2FyIElJIG1hcmtlZCBhIHNpZ25pZmljYW50IHRyYW5zaXRpb24gZnJvbSBjb2FsIHRvIG9pbCBhbmQgZ2FzIGFzIHRoZSBwcmltYXJ5IGVuZXJneSBzb3VyY2VzLCBpbmZsdWVuY2VkIGJ5IHRlY2hub2xvZ2ljYWwgcHJvZ3Jlc3MsIHVyYmFuaXNhdGlvbiwgYW5kIGVjb25vbWljIGdsb2JhbGlzYXRpb24uCgpFbWlzc2lvbnMgZnJvbSBzdGF0ZS1jb250cm9sbGVkIGVudGl0aWVzIGFyZSBwcmVkb21pbmFudGx5IHJlbGlhbnQgb24gY29hbCwgcmVmbGVjdGluZyBleHRlbnNpdmUgZG9tZXN0aWMgZW5lcmd5IGluaXRpYXRpdmVzIGFpbWVkIGF0IGVuc3VyaW5nIGVuZXJneSBzZWN1cml0eSBhbmQgZm9zdGVyaW5nIGVjb25vbWljIGdyb3d0aC4gVGhpcyBkZXBlbmRlbmNlIG9uIGNvYWwgcmVzdWx0cyBpbiBjb25zaWRlcmFibHkgaGlnaGVyIGVtaXNzaW9ucyBjb21wYXJlZCB0byB0aG9zZSBmcm9tIGludmVzdG9yLW93bmVkIGZpcm1zLiBJbiBjb250cmFzdCwgcHJpdmF0ZSBzZWN0b3IgY29tcGFuaWVzIHRlbmQgdG8gbWFpbnRhaW4gYSBtb3JlIGRpdmVyc2lmaWVkIGVuZXJneSBwb3J0Zm9saW8sIGRyYXdpbmcgYXR0ZW50aW9uIHRvIG9pbCBhbmQgZ2FzIGR1ZSB0byB0aGVpciBwcm9maXRhYmlsaXR5IGFuZCBtYXJrZXQgZGVtYW5kLiBUaGVzZSBjb21wYW5pZXMgYXJlIGFsc28gbW9yZSBhZGFwdGFibGUgdG8gcmVndWxhdG9yeSBwcmVzc3VyZXMsIHJlc3VsdGluZyBpbiBhIGxvd2VyIHJlbGlhbmNlIG9uIGNvYWwuCgpFbWlzc2lvbnMgdHJlbmRzIGNsb3NlbHkgZm9sbG93IHByb2R1Y3Rpb24gcGF0dGVybnMsIHdpdGggcGVha3MgaW4gY29hbC1yZWxhdGVkIGVtaXNzaW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmR1c3RyaWFsIGV4cGFuc2lvbiBvZiB0aGUgbWlkLTIwdGggY2VudHVyeSwgd2hpbGUgb2lsIGFuZCBnYXMgZW1pc3Npb25zIHJlYWNoZWQgdGhlaXIgcGVha3MgbGF0ZXIuIFRoZSBncmFkdWFsIGluY3JlYXNlIGluIG5hdHVyYWwgZ2FzIHByb2R1Y3Rpb24gc2lnbmlmaWVzIGl0cyByb2xlIGFzIGEgInRyYW5zaXRpb24gZnVlbCwiIG9mZmVyaW5nIGxvd2VyIGVtaXNzaW9ucyB0aGFuIGNvYWwgd2hpbGUgc3RpbGwgY29udHJpYnV0aW5nIHRvIG92ZXJhbGwgY2FyYm9uIG91dHB1dC4KClRoZSBpbnRlZ3JhdGVkIGFuYWx5c2lzIG9mIHByb2R1Y3Rpb24gYW5kIGVtaXNzaW9ucyBkYXRhIHVuZGVyc2NvcmVzIHRoZSBpbnRyaWNhdGUgbmF0dXJlIG9mIGdsb2JhbCByZXNvdXJjZSBjb25zdW1wdGlvbiBhbmQgaXRzIGVudmlyb25tZW50YWwgaW1wYWN0cy4gV2hpbGUgdGhlcmUgaXMgYSBub3RpY2VhYmxlIHRyYW5zaXRpb24gdG93YXJkcyBjbGVhbmVyIGVuZXJneSBzb3VyY2VzLCBleGVtcGxpZmllZCBieSB0aGUgaW5jcmVhc2VkIHVzZSBvZiBuYXR1cmFsIGdhcyBhbmQgYSByZWR1Y3Rpb24gaW4gY29hbCBkZXBlbmRlbmN5LCB0aGlzIHByb2dyZXNzIGlzIGluYWRlcXVhdGUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFyY2hpbmcgZ2xvYmFsIGNsaW1hdGUgb2JqZWN0aXZlcy4KCg==